当前位置: 首页 > news >正文

Elasticsearch collapse 的使用场景及作用机制

文章目录

  • 前言
  • 一、主要使用场景
  • 二、collapse 的基本用法
  • 三、inner_hits 作用:获取分组内的更多信息
  • 四、collapse 是否影响评分?
  • 五、collapse 的性能影响
  • 六、collapse vs. terms 聚合对比
  • 七、适用场景总结
  • 总结


前言

在 Elasticsearch 查询中,collapse(字段折叠)用于对指定字段的值进行分组,每组只返回一个文档。它的作用类似于 SQL 里的 GROUP BY,但 collapse 不会聚合所有字段,而是仅折叠查询结果的显示方式。


一、主要使用场景

collapse 主要用于以下场景:

  • 去重搜索:在电商、招聘、社交等场景中,可能会有多个文档代表同一个实体(如同一家公司不同的职位、同一商品的不同库存记录),collapse 可以确保只返回一个文档,避免重复展示。

  • 分组展示:例如,新闻搜索时,每个来源只返回一篇文章,以便提供多样化的搜索结果。

  • 提高查询效率:相比于 terms 聚合,collapse 只返回一个文档而不是所有文档,减少了数据传输和计算负担。

二、collapse 的基本用法

使用 collapse 需要在 query 之外的 collapse 字段中指定一个字段名。该字段必须是 keyword、numeric 或 date 类型,且不能是 analyzed 字段。

示例 1:对 company_id 进行折叠

{
  "query": {
    "match": {
      "title": "软件工程师"
    }
  },
  "collapse": {
    "field": "company_id"
  }
}

  • 这将确保结果中每个 company_id 只返回一个文档(该公司下最相关的一条招聘信息)。

三、inner_hits 作用:获取分组内的更多信息

默认情况下,collapse 只会返回每个分组中的一个文档。如果想要在每个分组中查看更多文档,可以使用 inner_hits。

示例 2:每个 company_id 下最多返回 3 条招聘信息

{
  "query": {
    "match": {
      "title": "软件工程师"
    }
  },
  "collapse": {
    "field": "company_id",
    "inner_hits": {
      "name": "top_jobs_per_company",
      "size": 3,
      "sort": [{ "salary": "desc" }]
    }
  }
}


  • 这将在每个 company_id 分组下返回最多 3 条职位信息,并按 salary 降序排列。

四、collapse 是否影响评分?

  • 影响主查询结果的评分排序:

    • collapse 不会影响查询的评分计算,但它会影响最终返回的文档,因为它筛选掉了一些评分较低的文档。
  • collapse 默认返回每个分组中评分最高的文档,因此在 collapse 后,最终结果仍然是按 score 排序的。

  • inner_hits 中的评分:

    • inner_hits 依然会按照 query 的评分排序,或者可以自定义 sort 排序规则。

五、collapse 的性能影响

collapse 相比 terms 聚合(terms 会返回所有匹配的文档并做聚合)更加轻量级,因此对于某些场景,它可以显著提高查询效率。

✅ 性能优势

  • 减少数据传输量: 只返回每个分组的一条数据,避免返回大量重复数据。

  • 比 terms 聚合更轻量: collapse 仅适用于搜索阶段,而 terms 聚合需要额外的计算和存储开销。

  • 更适合大数据量: 适用于上百万甚至上亿级别数据的去重查询,而 terms 聚合可能会因为 bucket 过多导致 OOM。

⚠️ 性能注意事项

  • 字段必须是 keyword、numeric 或 date 类型,不能是 text(未索引的文本字段)。

  • inner_hits 可能影响性能: inner_hits 需要加载更多文档,会增加查询开销。

  • 不适用于分页查询: collapse 仅影响当前 from + size 范围的文档,如果需要分页,每页可能会返回相同的 group,需要用 search_after 或 scroll 处理。

六、collapse vs. terms 聚合对比

特性collapseterms 聚合
作用每组返回一个文档计算每组的所有文档,并可做统计
适用场景仅展示每个分组的一个代表文档需要统计、分析所有分组数据
影响评分不影响计算方式,但影响最终返回的文档只用于统计,不影响查询的评分
内存占用 低(仅保留 from + size 范围的折叠数据)高(可能需要存储所有匹配文档)
适用于大数据可能会 OOM

七、适用场景总结

业务场景推荐使用
只想展示每个分组的一个结果,如每家公司最多一个职位✅ collapse
需要统计各分组的所有数据,如统计不同公司的职位总数❌ 使用 terms 聚合
需要分页且分组后仍能正确分页❌ terms 聚合 或 search_after
需要在一个分组下获取多个结果(但不是所有)✅ collapse + inner_hits

总结

  • collapse 适用于去重搜索,如展示唯一的公司、商品或用户等,而不会影响评分计算方式。

  • collapse 比 terms 聚合更高效,尤其是对于大数据场景。

  • inner_hits 可用于查看分组内更多文档,但可能影响查询性能。

  • collapse 适合搜索场景,而 terms 聚合更适合统计和分析。

如果你的数据量较大,并且希望提高查询效率,同时避免返回重复数据,那么 collapse 是一个非常好的选择!

http://www.dtcms.com/a/107838.html

相关文章:

  • Linux驱动开发实战(十一):GPIO子系统深度解析与RGB LED驱动实践
  • es 集群存储字典 json字段----python实现
  • Conda安装ffmpeg
  • idea查看class字节码
  • Java高频面试题1:Java SE
  • SpaceX星舰商业载人首绕月球:私人太空旅行时代正式开启
  • mycat --分片规则--
  • [Android] 共生地球 v1.1.19 国产卫星地图
  • 详细介绍一下C++中的extern关键字
  • 搭建qemu环境
  • 【pcdet3D检测】——OPenpcdet如何进行测试文件配置?能否自定义测试数据?一文看懂pointpillar(pcdet)中的test.py
  • redis7.0搭建redis-cluster集群部署实战
  • AquaMoon and Chess_CodeForces - 1545B
  • AI前沿:资本狂潮下的技术暗战:巨头博弈、开源革命与生态重构
  • Java项目之基于ssm的简易版营业厅宽带系统(源码+文档)
  • Ubuntu 使用apt安装MySQL后的升级方法
  • Share02-小小脚本大大能量
  • 【面试篇】多线程
  • RTX5080 安装torch,torchvision ,torchaudio 指南
  • 全功能在线WEB工具箱PHP源码
  • 3. 线程间共享数据
  • 跨网文件安全交换系统|国产信创认证+安全高效传输
  • 2025-4-2 蓝桥杯刷题情况(分布式队列)
  • 智能觉醒:四大AI Agent框架重构未来生产力
  • 简单描述一下Unity物理系统的主要性能消耗点
  • 【高项】信息系统项目管理师(十五)高级项目管理【4分】
  • RocketMq 5.0之后延时消息底层是怎么实现的?
  • C++(匿名函数+继承+多态)
  • MySQL GROUP BY 和 HAVING 子句中 ‘Unknown column‘ 错误的深入解析
  • 详细介绍一下C++的按位运算