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


前言

在 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 是一个非常好的选择!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kse_music

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值