Elasticsearch significant_text聚合能否用于multi-fields多字段?
Elasticsearch significant_terms/significant_text聚合多字段使用问题
问题描述
- 官方文档未明确说明
significant_terms、significant_text聚合是否支持multi-fields(多字段)场景,相关官方文档地址:significant_text聚合官方说明 - 测试场景:在配置了shingles过滤器/分析器的多字段
name.shingles上执行显著词聚合,外层嵌套sampler聚合,设置shard_size为100。
测试聚合语句
"aggregations": { "significant_words": { "sampler": { "shard_size": 100 }, "aggs": { "keywords": { "significant_text": { "field": "name.shingles" } } } } }
返回结果
聚合返回空桶,具体内容:
"aggregations" : { "significant_words" : { "doc_count" : 5, "keywords" : { "doc_count" : 5, "bg_count" : 153313, "buckets" : [ ] } } }
字段映射配置
"name" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword" }, "shingles" : { "type" : "text", "analyzer" : "shingle_analyzer", "fielddata" : true } } }
- 异常现象:sampler聚合
doc_count为5,significant_text子聚合doc_count为5、bg_count为153313,但buckets数组为空,需要确认该类聚合是否支持多字段场景,以及当前配置存在的问题。
解答
- 多字段支持性结论:
significant_terms、significant_text完全支持multi-fields场景。ES的多字段本质是基于同一份源数据构建的独立索引字段,和普通单字段在聚合执行逻辑上没有差异,空桶问题和多字段特性无关。 - 空桶核心原因:
- 前景样本量不足。当前sampler聚合仅命中5个文档,而
significant_text默认要求词条至少在3个前景文档中出现才会纳入候选(min_doc_count默认值为3),同时显著性算法要求词条在前景集的出现占比显著高于15万+文档的背景集占比,5个文档中的shingle词条很难满足阈值要求,因此返回空桶。 - 默认过滤规则拦截。
significant_text默认会自动过滤低频词、停用词、无统计区分度的词条,如果自定义的shingle分析器生成了大量通用组合词,会直接被判定为无显著价值过滤。
- 前景样本量不足。当前sampler聚合仅命中5个文档,而
- 修复步骤:
- 临时调低阈值验证基础功能:在
significant_text配置中增加"min_doc_count": 1、"shard_min_doc_count": 1参数,执行查询确认是否能正常返回词条。 - 校验shingle分析器配置:确认shingle的
min_shingle_size、max_shingle_size参数设置合理,不会生成大量无意义的通用词组,必要时增加停用词过滤规则,减少无效词条干扰。 - 适当调大sampler聚合的
shard_size参数,扩充前景样本的文档量,为显著性统计提供足够的样本支撑,后续再根据业务需求调整显著性算法的阈值参数即可。
- 临时调低阈值验证基础功能:在
内容的提问来源于stack exchange,提问作者user18154574
相关产品推荐
相关产品推荐

