上一篇【第19篇】Elasticsearch Body模式搜索详解——分页、排序与高亮下一篇【第21篇】Elasticsearch深度分页解决方案——Scroll与search_after摘要在日常搜索应用开发中,基础的关键词匹配往往无法满足复杂的业务需求。Elasticsearch提供了一系列进阶搜索特性,帮助开发者实现更精准、更灵活的搜索体验。本文详细讲解七大进阶搜索功能:collapse折叠按字段去重并用inner_hits展示分组详情;indices_boost为不同索引分配搜索权重;min_score过滤低相关性文档;_name查询命名便于调试和日志追踪;rescore重排序使用二级算法优化Top-K精排结果;script_fields脚本字段通过Painless脚本动态计算字段值;post_filter在聚合计算完成后进行二次过滤。文中每个特性均配有完整的REST API代码示例,并通过对比表格帮助理解各功能的使用场景与注意事项。关键词:Elasticsearch;折叠去重;重排序;脚本字段;post_filter;搜索进阶;indices_boost一、collapse折叠结果1.1 基本概念collapse参数允许基于某个字段值对搜索结果进行折叠(去重),每个折叠键只保留排序最靠前的一条文档。这在需要按字段分组展示唯一记录的搜索场景中非常实用。GET/twitter/_search{"query":{"match":{"message":"Elasticsearch"}},"collapse":{"field":"user"},"sort":[{"likes":{"order":"desc"}}]}响应中每条文档代表一个user的最优结果,同时hits.total仍然反映匹配文档的真实总数(非去重后数量)。1.2 折叠约束约束条件说明字段类型必须为单值keyword或numeric字段doc_values必须开启doc_values属性排序折叠只保留排序最靠前的文档,因此必须配合sort使用二级折叠支持在inner_hits内再次折叠1.3 inner_hits展开每组结果inner_hits可以展开每个折叠组内的更多文档:GET/twitter/_search{"query":{"match":{"message":"Elasticsearch"}},"collapse":{"field":"user","inner_hits":{"name":"top_tweets","size":3,"sort":[{"date":"desc"}]}},"sort":[{"likes":"desc"}]}响应结构:{"hits":{"hits":[{"_id":"10","_source":{"user":"kimchy","message":"...","likes":100},"fields":{"user":"kimchy"},"inner_hits":{"top_tweets":{"hits":{"hits":[{"_source":{"user":"kimchy","message":"...","likes":99}},{"_source":{"user":"kimchy","message":"...","likes":85}},{"_source":{"user":"kimchy","message":"...","likes":72}}]}}}}]}}1.4 多组inner_hits可以为同一个折叠定义多个不同排序的inner_hits:GET/twitter/_search{"query":{"match_all":{}},"collapse":{"field":"user","inner_hits":[{"name":"most_liked","size":3,"sort":[{"likes":"desc"}]},{"name":"most_recent","size":3,"sort":[{"date"
【Elasticsearch从入门到精通】第20篇:Elasticsearch搜索进阶——折叠、重排序与脚本字段
发布时间:2026/6/4 9:32:21
上一篇【第19篇】Elasticsearch Body模式搜索详解——分页、排序与高亮下一篇【第21篇】Elasticsearch深度分页解决方案——Scroll与search_after摘要在日常搜索应用开发中,基础的关键词匹配往往无法满足复杂的业务需求。Elasticsearch提供了一系列进阶搜索特性,帮助开发者实现更精准、更灵活的搜索体验。本文详细讲解七大进阶搜索功能:collapse折叠按字段去重并用inner_hits展示分组详情;indices_boost为不同索引分配搜索权重;min_score过滤低相关性文档;_name查询命名便于调试和日志追踪;rescore重排序使用二级算法优化Top-K精排结果;script_fields脚本字段通过Painless脚本动态计算字段值;post_filter在聚合计算完成后进行二次过滤。文中每个特性均配有完整的REST API代码示例,并通过对比表格帮助理解各功能的使用场景与注意事项。关键词:Elasticsearch;折叠去重;重排序;脚本字段;post_filter;搜索进阶;indices_boost一、collapse折叠结果1.1 基本概念collapse参数允许基于某个字段值对搜索结果进行折叠(去重),每个折叠键只保留排序最靠前的一条文档。这在需要按字段分组展示唯一记录的搜索场景中非常实用。GET/twitter/_search{"query":{"match":{"message":"Elasticsearch"}},"collapse":{"field":"user"},"sort":[{"likes":{"order":"desc"}}]}响应中每条文档代表一个user的最优结果,同时hits.total仍然反映匹配文档的真实总数(非去重后数量)。1.2 折叠约束约束条件说明字段类型必须为单值keyword或numeric字段doc_values必须开启doc_values属性排序折叠只保留排序最靠前的文档,因此必须配合sort使用二级折叠支持在inner_hits内再次折叠1.3 inner_hits展开每组结果inner_hits可以展开每个折叠组内的更多文档:GET/twitter/_search{"query":{"match":{"message":"Elasticsearch"}},"collapse":{"field":"user","inner_hits":{"name":"top_tweets","size":3,"sort":[{"date":"desc"}]}},"sort":[{"likes":"desc"}]}响应结构:{"hits":{"hits":[{"_id":"10","_source":{"user":"kimchy","message":"...","likes":100},"fields":{"user":"kimchy"},"inner_hits":{"top_tweets":{"hits":{"hits":[{"_source":{"user":"kimchy","message":"...","likes":99}},{"_source":{"user":"kimchy","message":"...","likes":85}},{"_source":{"user":"kimchy","message":"...","likes":72}}]}}}}]}}1.4 多组inner_hits可以为同一个折叠定义多个不同排序的inner_hits:GET/twitter/_search{"query":{"match_all":{}},"collapse":{"field":"user","inner_hits":[{"name":"most_liked","size":3,"sort":[{"likes":"desc"}]},{"name":"most_recent","size":3,"sort":[{"date"