简单查询
"query": {
"simple_query_string": { "query":"great guide" }
},
按预期返回我的文档,其中包含
"groups": [
"Local Business"
],
但是,如果我使用过滤器,则不会返回任何文档:
"query": {
"bool":{
"must":[
{"simple_query_string": { "query":"great guide" }}
],
"filter":{
"terms":{
"groups":["Local Business"]
}
}
}
},
如果删除“过滤器”键和值,则将检索文档。
过滤器为什么不匹配文档?
答案 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
转换成小写字母,然后将local
和business
保存为倒排索引中的两个单词。
Elasticsearch仅在您查询的单词与索引中的可用单词匹配时才为您提供结果。
keyword
的作用是,将Local Business
保留为倒排索引。
注意:如果尚未定义映射并且是动态创建的,则可以通过将groups
替换为groups.keyword
来尝试查询。
希望这会有所帮助!