在大多数搜索应用程序中,尤其是在电商、社交媒体或内容聚合平台中,我们常常遇到这样一个需求:希望将具有相同属性(例如同一商品的不同规格、同一作者的不同文章等)的搜索结果合并或折叠在一起,而不是显示冗余的重复项。Elasticsearch 提供了一个强大的功能来实现这一需求:Field Collapsing。本文将详细介绍 Elasticsearch 的 Field Collapsing 功能及其使用场景。
什么是 Field Collapsing?
Field Collapsing 是 Elasticsearch 7.x 版本开始引入的一个特性,它允许你将搜索结果按照某个字段的值进行折叠。折叠的结果中,每个唯一字段值只会显示一个文档,而不是展示所有匹配的文档。这在需要去重、分组展示或提高结果精简度时非常有用。
典型应用场景
-
商品搜索:在电商平台上,同一商品可能有多个规格或颜色。如果不做折叠,用户在搜索时可能会看到多个几乎相同的结果。使用 Field Collapsing,可以只展示每个商品的一个结果,而不是多个规格版本。
-
内容聚合:在新闻或社交媒体平台中,同一作者可能发布多篇相似内容。折叠可以确保每个作者只展示一个结果,而不是所有文章。
-
数据去重:对于某些场景,特别是去重场景,Field Collapsing 可以直接根据指定字段折叠相同的文档,减少重复结果。
Field Collapsing 的工作原理
Field Collapsing 的核心在于通过一个字段来对结果集进行分组和折叠。在 Elasticsearch 的查询中,可以通过 collapse 参数实现这一功能。该参数通常配合 inner_hits 来展示每个折叠组中的具体文档信息。
基本用法
我们来看看如何在 Elasticsearch 查询中使用 Field Collapsing。
示例场景:商品搜索
假设我们有一个商品索引,其中包含多个规格的同一商品。我们希望在用户搜索时,只展示每个商品的一个版本,而不是显示所有规格。
索引示例
POST /products/_bulk
{
"index": {
"_id": "1" } }
{
"name": "iPhone 12", "color": "black", "price": 699 }
{
"index": {
"_id": "2" } }
{
"name": "iPhone 12", "color": "white", "price": 699 }
{
"index": {
"_id": "3" } }
{
"name": "iPhone 12", "color": "red"

最低0.47元/天 解锁文章
2773

被折叠的 条评论
为什么被折叠?



