Elasticsearch跨多索引取Top N文档按索引分组如何限制总返回数
调整方案
你当前的DSL是按索引分组后每个组返回20条,总条数会随匹配索引数量增加而超出限制,要实现全局总返回不超过20条可以用以下两种方案:
方案1:业务侧自行分组(性能最优)
直接查询全局匹配度最高的20条文档,拿到结果后在业务代码中按_index字段分组即可,无额外聚合开销,查询效率最高:
{ "size": 20, "query": { "multi_match" : { "query": "some term" } } }
方案2:ES侧直接返回分组结构
如果需要ES直接输出按索引分组后的结果,不需要业务二次处理,可以用sampler聚合先限定采样范围为全局Top20,再做索引分组:
{ "size": 0, "query": { "multi_match" : { "query": "some term" } }, "aggs": { "global_top_samples": { "sampler": { "shard_size": 20 }, "aggs": { "by_index": { "terms": { "field": "_index" }, "aggs": { "group_top_docs": { "top_hits": { "size": 20 } } } } } } } }
注:如果集群索引分片数较多,可以把shard_size适当调大到30~50,避免分片返回的Top结果不足导致全局排序精度下降,最终合并后的总文档数仍会保持在20以内。
内容的提问来源于stack exchange,提问作者Vasily Kolesnikov
相关产品推荐
相关产品推荐

