在Elasticsearch中如何基于数组字段的元素数量实现聚合统计
Elasticsearch 按Itinerary数组字段元素数量聚合方案
完全可以实现该统计需求,以下是两种常用的实现方案:
方案1:运行时字段实时计算(无需修改现有索引结构)
适合临时查询场景,不用调整现有索引的Mapping,通过运行时字段实时计算数组长度后做聚合即可,DSL示例如下:
POST /你的索引名称/_search { "size": 0, // 不返回原始文档,只返回聚合结果 "runtime_mappings": { "itinerary_length": { "type": "integer", "script": "emit(doc['Itinerary'].size())" } }, "aggs": { "itinerary_count_stats": { "terms": { "field": "itinerary_length", "size": 6 // 你的数组最多只有6个元素,直接取前6条聚合结果即可 } } } }
*注意:如果你的Itinerary字段配置为nested类型,将上述脚本调整为emit(params._source['Itinerary'].size())即可正常获取数组长度。
聚合返回结果中,itinerary_count_stats下的每个bucket的key就是数组元素数量,doc_count就是对应数量的文档总数,你只需做简单的格式转换就能得到你需要的1 item : 2这类展示结果。
方案2:预存长度字段(性能更优,适合高频查询)
如果该统计是业务高频使用的功能,更推荐你在写入文档时新增一个itinerary_len整数类型字段,直接存储当前文档Itinerary数组的元素数量,后续聚合直接基于该字段查询即可,性能远高于实时计算的方案,DSL示例如下:
POST /你的索引名称/_search { "size": 0, "aggs": { "itinerary_count_stats": { "terms": { "field": "itinerary_len", "size": 6 } } } }
内容的提问来源于stack exchange,提问作者Ryan Tee
相关产品推荐
相关产品推荐

