Elasticsearch多组terms过滤条件组合查询无结果问题求助
问题根因
你遇到的问题和多组terms同时使用没有关系,核心是两个原因叠加导致的:
bool查询的filter数组下的所有条件是AND 逻辑,需要同时满足才会返回文档,你删除任意一个条件就有结果,说明索引里不存在同时满足所有filter条件的文档- 你直接用
terms查询作用在text类型字段上的逻辑不符合预期:terms是精确匹配查询,只会匹配分词后和查询值完全一致的结果,而extension、userContentType这类枚举值字段,你要做精确匹配应该用映射里自带的keyword子字段
修复方案
把所有terms查询的字段替换为对应的keyword子字段即可,修改后的查询示例如下:
{ "from": 0, "min_score": 0.5, "query": { "bool": { "filter": [ { "terms": { "extension.keyword": [ "bmp", "jpg", "tif", "img", "png", "gif", "jpeg" ] } }, { "terms": { "userContentType.keyword": [ "webpage" ] } }, { "terms": { "language.keyword": [ "en", "gen" ] } }, { "terms": { "metaLanguage.keyword": [ "en" ] } } ], "should": [ { "multi_match": { "fields": [ "title", "description^5", "partNumber", "guid", "metaId", "keywords" ], "lenient": true, "query": "technology" } } ] } }, "size": 50, "sort": [ { "userContentType.keyword": { "order": "desc" } }, { "_score": { "order": "desc" } } ] }
可选排查步骤
如果修改后还是没有结果,可以按以下步骤确认数据情况:
- 先执行仅带
extension.keyword和userContentType.keyword两个过滤条件的查询,size设为0,查看返回的命中总数是否为0,确认是否真的没有同时满足两个条件的文档 - 单独查询
userContentType.keyword: "webpage"的文档,随便取几篇查看extension字段的实际值,确认是否在你给出的后缀列表中,有没有大小写、多余字符(比如带.的.jpg)的问题 - 如果需要忽略大小写匹配,可以给对应的
keyword字段添加小写normalizer,或者把terms查询换成不区分大小写的match查询
内容的提问来源于stack exchange,提问作者Rich_J
相关产品推荐
相关产品推荐

