elasticsearch中的collapse
功能允许用户对搜索结果进行分组,这在某些情况下可以看作是一种去重操作。它的主要目的是在搜索大量文档时,只显示每个分组的一个代表文档,而不是显示所有匹配的文档。
collapse
功能基于一个或多个字段的值对搜索结果进行分组。当你指定了collapse
参数后,Elasticsearch会在后台对匹配的文档进行分组,并且每个分组只会返回一个代表文档。这个代表文档通常是分组中的第一个文档,但也可以通过其他参数进行定制。
以下是如何在Elasticsearch查询中使用collapse
的基本示例:
在这个示例中:
query
部分定义了搜索的基本条件。在这个例子中,我们搜索字段field
值为value
的文档。collapse
部分指定了用于分组的字段,即group_field
。所有在这个字段上具有相同值的文档将被分组在一起,并且只返回一个代表文档。你还可以通过添加inner_hits
参数来定制返回的分组代表文档。例如,如果你想在每个分组中返回评分最高的文档,你可以这样做:
inner_hits
部分定义了如何为每个分组选择代表文档。这里,我们命名了inner_hits
的结果为most_relevant
。size: 1
表示每个分组只返回一个文档。sort
部分指定了如何对分组内的文档进行排序。在这里,我们根据文档的评分(_score
)进行降序排序,因此每个分组的代表文档将是该分组中评分最高的文档。scroll
、rescore
及search_after
结合使用: 由于collapse
需要对结果进行分组和排序以确定每个组的最佳匹配文档,这个过程可能会与scroll
、rescore
和search_after
的某些功能冲突。collapse
通常比完全的分组和聚合操作更高效,因为它只返回每个组的最佳文档,但处理大量数据时仍可能产生性能开销。collapse
参数所使用的字段必须是keyword
或number
类型,因为这些类型的字段值精确,适用于分组和排序。使用text
类型字段可能导致不准确的结果。在使用collapse
时,请务必考虑这些限制和注意事项,以确保查询的准确性和性能。通过合理规划和优化查询,可以充分利用collapse
的分组功能,同时避免潜在的性能瓶颈。
结合使用字段聚合(terms)和top_hits聚合可以实现去重功能。
结合这两种聚合,我们可以先按照某个字段进行分组(实现初步的“去重”效果,即每个分组代表一个唯一的字段值),然后在每个分组中使用top_hits聚合返回代表性的文档,从而实现更精细的去重功能。
有一个包含商品信息的索引,并且你想按照“品牌”字段对商品进行去重,以便每个品牌只显示一个代表性商品。查询可能如下所示:
我们首先使用terms聚合按照“品牌”字段对商品进行分组,然后在每个分组中使用top_hits聚合返回一个代表性商品(评分最高的商品)。这样,我们就实现了按照品牌对商品进行去重的功能。
terms
)+ top_hits
聚合terms
聚合按某个字段的值进行分组,然后在每个分组内部使用top_hits
聚合来获取每个分组的顶部文档。terms
聚合的字段,以及top_hits
聚合返回的文档数量和排序方式。collapse
功能collapse
功能通过指定一个字段来对搜索结果进行分组,并且每组只返回一个最佳匹配的文档(通常是基于排序字段的最高或最低值)。top_hits
提供了更多的自定义选项,可以按多个字段进行分组,并控制返回的文档数量和排序。而collapse
则更简单直接,只基于一个字段进行分组。collapse
可能更高效,因为它避免了复杂的聚合计算。然而,实际性能还取决于具体的使用场景和数据分布。top_hits
可以返回更丰富的信息,包括分组大小和多个代表文档。而collapse
只返回每个分组的最佳文档。在选择使用哪种方法时,应根据具体需求、数据量和性能要求来权衡。如果你需要详细的分组统计信息和多个代表文档,字段聚合+top_hits
可能是更好的选择。如果你只需要快速获取每个分组的最佳文档,并且关注性能,那么collapse
可能更适合你。
cardinality聚合是一种用于统计某个字段中不同值的数量基数(即去重后的数量)的功能。
假设你有一个包含商品销售数据的Elasticsearch索引,你想统计“color”字段中有多少种不同的颜色。你可以使用以下查询来实现:
这个查询会返回一个聚合结果,其中包含“color”字段中不同颜色的数量。
cardinality 度量是一个近似算法。 它是基于 HyperLogLog++ (HLL)算法的。 HLL 会先对我们的输入作哈希运算,然后根据哈希运算的结果中的 bits 做概率估算从而得到基数。
我们不需要理解技术细节, 但我们最好应该关注一下这个算法的 特性 :
要配置精度,我们必须指定 precision_threshold 参数的值。 这个阈值定义了在何种基数水平下我们希望得到一个近乎精确的结果.
返回结果:
解释说明:
hits
中的total
字段显示的总条数,实际上是查询结果在去重之前的总数量,也就是原始数据的条数。这个数值在分页功能中通常不会被直接使用。而hits
数组的大小与aggregations
中的courseAgg
聚合值相等,表示数组中展示的是去重后的数据。
aggregations
中的courseAgg
条数,代表去重后的实际数据条数,这也是进行分页时所使用的关键数值,它指示了去重后可用于展示的总条数。
from
参数表示查询的起始位置,即从哪里开始检索数据,它相当于查询的偏移量。
size
参数定义了每次查询返回的数据条数,即一次检索并展示多少条记录。