如何使用Elasticsearch multisearch API获取合并的单一命中结果数组
解决方案
方案1:调整查询逻辑,替换msearch为单bool查询(最推荐)
该方案天然满足去重、返回单结果集、原生支持分页的需求,不需要额外做结果处理,适配ES 7.9全版本。
查询语句示例:
GET /sample/_search { "query": { "bool": { "should": [ {"match": {"first_name": "John"}}, {"match": {"last_name": "Doe"}} ], "minimum_should_match": 1 } } }
should子句会匹配满足任意一个查询条件的文档,ES会自动对所有匹配文档去重、算分排序,返回的hits数组就是符合要求的单一结果集,直接用from+size或者search_after就能实现分页。如果需要调整不同条件的匹配优先级,可以给对应match语句加boost参数调整权重。
方案2:保留msearch,业务层做结果合并
如果你的业务场景必须拆分多个独立查询(比如需要查询不同索引、各查询有独立的排序/过滤规则),可以在代码层处理返回结果:
- 去重合并:遍历msearch返回的
responses数组,将每个子查询的hits.hits元素以文档_id为唯一key存入Map/字典,自动覆盖重复的同id文档,最终将Map的value转为数组即可。 - 非去重合并:直接遍历所有子查询的
hits.hits,依次追加到同一个数组中即可。
注意:如果需要分页,这种方案需要先拉取所有子查询的全量命中结果再做分页截取,数据量较大时性能损耗较高,更推荐用方案1。
内容的提问来源于stack exchange,提问作者Manonandan S K
相关产品推荐
相关产品推荐

