2017-04-04 113 views
0

我正在使用'必須'和'must_not'功能的布爾查詢。它按預期工作,直到我到達一個3層深的房產。例如簡單的匹配查詢,如...ElasticSearch |布爾查詢

GET city/town/_search 
{ 
    "query": { 
     "match": { 
      "contact.residence.address": "Rocky Road" 
     } 
    } 

} 

作品只是罰款,並返回結果,但如果我做同樣的布爾查詢如..

GET city/town/_search 
{ 
    "query": { 
     "bool": { 
     "must": [ 
      { 
       "term": { 
        "contact.residence.address": "Rocky Road" 
       } 
      } 
     ] 
     } 
    } 
} 

返回任何結果。爲什麼是這樣?????請記住其他布爾查詢,如..

GET city/town/_search 
{ 
    "query": { 
     "bool": { 
     "must": [ 
      { 
       "term": { 
        "store.name": "Hendersons" 
       } 
      } 
     ] 
     } 
    } 
} 

工作就好!它僅適用於3級深的任何字段,因此搜索任何屬於prop1.prop3.prop3的術語

+0

你可能有'contact.residence.address'場用「文本」類型映射。如果是這種情況,那麼在第二個查詢中用'match'替換'term'將按預期工作。我建議你閱讀一節爲什麼查詢詞不符合我的文檔?在官方文檔[這裏](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html#query-dsl-term-query)。 – avr

回答

2

原因是第一個搜索使用match查詢,而另一個使用term查詢。不同的是,match查詢將分析器應用於輸入正確的輸入。 term查詢不會分析您的輸入並將其用作單個詞條。這可能產生相同的結果對於喜歡「大腳」輸入,但輸入「崎嶇之路」,它必須被分裂成兩個詞,所以你必須使用match查詢

GET city/town/_search 
{ 
    "query": { 
     "bool": { 
     "must": [ 
      { 
       "match": { 
        "contact.residence.address": "Rocky Road" 
       } 
      } 
     ] 
     } 
    } 
} 
+0

工作就像一個魅力。謝謝! – emarel