ElasticSearch 6.2.3过滤布尔查询失效求助(Ubuntu环境)
解决Elasticsearch过滤查询返回0条结果的问题
嘿,别担心,新手遇到这种问题太正常啦!我来帮你排查下原因~
你遇到的核心问题是精确匹配的term查询没有命中数据,最常见的原因是字段的映射类型导致的,咱们一步步来分析:
1. 先排查字段的映射类型
Elasticsearch里的term查询是精确匹配,但如果你的publishStatus字段被映射成了text类型(ES默认会把字符串字段设为text),那么存入的PUBLISHED会被分词器转换成小写的published,这时候用term查询大写的PUBLISHED自然找不到任何结果。
你可以先执行这个命令查看字段的映射:
GET /index/_mapping/type
如果看到publishStatus的类型是text,并且带有keyword子字段(ES 6.x默认会生成),那问题就找到了!
2. 修改查询语句解决问题
针对这个情况,你有两种修改方式:
方式一:使用keyword子字段进行精确匹配
直接在字段名后加上.keyword,这样就能匹配原始的未分词字符串:
GET /index/type/_search { "query": { "bool" : { "must" : { "multi_match" : { "query": "Funny black cat", "operator": "and", "fields": [ "title", "description"] } }, "filter": { "term" : { "publishStatus.keyword" : "PUBLISHED" } } } } }
方式二:使用match查询(适合text类型字段)
如果你的场景不需要严格的精确匹配,也可以用match查询,它会自动按照字段的分词规则去匹配:
GET /index/type/_search { "query": { "bool": { "filter": { "match": { "publishStatus": "PUBLISHED" } } } } }
3. 额外建议
如果这个字段本来就应该是精确匹配的状态值(比如PUBLISHED/DRAFT这类枚举值),建议你在创建索引的时候,直接把publishStatus的类型设为keyword,这样后续查询就不会踩分词的坑啦!
内容的提问来源于stack exchange,提问作者Don Moore
相关产品推荐
相关产品推荐

