ElasticSearch重要词聚合疑问:搜索词的doc_count与bg_count不匹配
关于Elasticsearch Significant Terms Aggregation中doc_count与bg_count不等的问题分析
嘿,我来帮你拆解这个疑惑~首先得把doc_count和bg_count的真实含义掰扯清楚,这大概率是你理解偏差的核心点:
先明确两个字段的正确定义
doc_count:它统计的是当前聚合上下文范围内(也就是你执行聚合时的查询/过滤结果集),包含该词条的文档数量。不是“同时匹配关键词和过滤条件”,而是“在过滤后的文档池里,有多少篇包含这个词条”。bg_count:它统计的是背景数据集里包含该词条的文档数量。这里的背景集默认是整个索引,但如果你设置了background_filter参数,或者你的聚合是嵌套在某个查询下的,背景集就会变成你指定的范围,而非全量数据。
为什么两者会不相等?
最常见的场景就是你的聚合是基于一个限定范围的查询/过滤结果来执行的:
举个简单例子:
假设你的索引总共有1000篇文档,其中有500篇包含“elasticsearch”(这时候默认bg_count=500)。然后你做了一个过滤查询,只筛选出tag:开发的文档,共200篇,其中150篇包含“elasticsearch”(这时候doc_count=150)。这时候执行significant terms聚合,“elasticsearch”的doc_count和bg_count自然就不一样——因为前者是过滤后的小池子的统计,后者是全索引的统计。
另外还有两种可能:
- 你手动配置了
background_filter:比如你把背景集限定为tag:运维的文档,那bg_count就是运维标签下包含该词条的数量,和当前聚合的上下文(比如tag:开发)的doc_count肯定不同。 - 字段分词的影响:如果你的字段是分词字段,比如搜索词是“java”,但文档里有“java编程”,分词后“java”会被统计,但如果当前上下文和背景集的文档构成不同,统计数量也会出现差异。
什么时候两者才会相等?
只有当你的聚合上下文(查询/过滤后的结果集)完全等于背景集的时候,比如:
- 你没有设置任何过滤条件,直接对全索引做significant terms聚合;
- 你设置的
background_filter和聚合的上下文过滤条件完全一致。
这时候doc_count和bg_count才会是同一个数值。
所以你可以先检查下自己的聚合查询:是否加了前置的过滤条件?有没有配置background_filter?这些都会导致两个数值出现差异,这其实是符合Elasticsearch的设计逻辑的哦~
内容的提问来源于stack exchange,提问作者Metropolis
相关产品推荐
相关产品推荐

