带过滤器的布尔查询不返回任何文档

时间:2018-11-13 16:46:30

标签: elasticsearch

简单查询

"query": {
    "simple_query_string": { "query":"great guide" } 
},

按预期返回我的文档,其中包含

"groups": [
        "Local Business"
],

但是,如果我使用过滤器,则不会返回任何文档:

"query": {
        "bool":{
            "must":[
                 {"simple_query_string": { "query":"great guide" }} 
            ],
            "filter":{
              "terms":{
                "groups":["Local Business"]
              }
            }
        }
    },

如果删除“过滤器”键和值,则将检索文档。

过滤器为什么不匹配文档?

1 个答案:

答案 0 :(得分:1)

如果groups字段的类型为keyword,则您提到的查询将按预期工作。

但是如果字段groups的类型为text,则该字段将无效。在这种情况下,以下查询实际上可以满足您的需求。

查询组-输入文本

POST <your_index_name>/_search
{  
   "query":{  
      "bool":{  
         "must":[  
            {  
               "simple_query_string":{  
                  "query":"great guide"
               }
            }
         ],
         "filter":{  
            "match":{  
               "groups":"Local Business"
            }
         }
      }
   }
}

您提到的查询不适用于类型text的原因是因为该字段在默认情况下会使用Analysis进入Standard Analyzer阶段,首先将Local Business转换成小写字母,然后将localbusiness保存为倒排索引中的两个单词。

Elasticsearch仅在您查询的单词与索引中的可用单词匹配时才为您提供结果。

keyword的作用是,将Local Business保留为倒排索引。

注意:如果尚未定义映射并且是动态创建的,则可以通过将groups替换为groups.keyword来尝试查询。

希望这会有所帮助!

相关问题