2017-04-04 121 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