如何在Elasticsearch多索引查询中为过滤器和should子句指定索引?
跨Elasticsearch索引查询的索引指定需求实现
原始查询
POST index1,index2/_search { "query": { "bool": { "filter": [ { "term": { "company": { "value": "ORGUNITID", "boost": 1 } } } ], "should": [ { "match_phrase_prefix": { "name": { "query": "es" } } }, { "match_phrase_prefix": { "synonyms": { "query": "es" } } } ], "adjust_pure_negative": true, "minimum_should_match": "1", "boost": 1 } } }
需求说明
- 需求1:第一个
should查询仅作用于index1,第二个should查询仅作用于index2,即便无法实现也不影响查询运行; - 需求2:为
filter中的term查询指定对应索引,这一点至关重要,否则另一索引的查询将无法正常工作。
实现方案
完全可以实现这两个需求,核心是用Elasticsearch自带的indices查询类型,它专门用来在多索引查询场景里指定查询生效的索引范围。
针对需求2:给filter的term查询绑定索引
用indices包裹原term查询,通过indices参数指定要生效的索引,同时设置no_match_query: "none"——意思是在非指定索引上不执行该查询,直接返回空匹配,不会干扰其他索引的查询逻辑。
针对需求1:让should查询分别作用于指定索引
同样用indices包裹每个match_phrase_prefix查询,分别绑定对应的索引,且设置no_match_query: "none",这样该查询只会在目标索引上执行,其他索引上不会产生匹配结果,完全满足“不影响整体查询运行”的要求。
修改后的完整查询
POST index1,index2/_search { "query": { "bool": { "filter": [ { "indices": { "indices": ["index1", "index2"], // 替换为term查询需要生效的具体索引,比如仅index1生效就写["index1"] "query": { "term": { "company": { "value": "ORGUNITID", "boost": 1 } } }, "no_match_query": "none" } } ], "should": [ { "indices": { "indices": ["index1"], "query": { "match_phrase_prefix": { "name": { "query": "es" } } }, "no_match_query": "none" } }, { "indices": { "indices": ["index2"], "query": { "match_phrase_prefix": { "synonyms": { "query": "es" } } }, "no_match_query": "none" } } ], "adjust_pure_negative": true, "minimum_should_match": "1", "boost": 1 } } }
关键说明
indices参数:支持填写单个或多个索引名,明确当前查询的生效范围;no_match_query: "none":保证非目标索引上该查询不会产生任何匹配,既不会过滤数据,也不会影响评分,完全符合需求里的容错要求;- 如果你的
filter查询需要同时作用于两个索引,就把indices设为["index1", "index2"],只需单个索引生效就只写对应索引名。
内容的提问来源于stack exchange,提问作者Fabrizio Stellato
相关产品推荐
相关产品推荐

