如何统计ElasticSearch文档attachments数组的总数量及单文档对应数量
ElasticSearch attachments数组统计实现方案
1. 统计所有文档attachments数组元素总个数
使用sum聚合配合脚本动态计算每个文档的attachments数组长度,再累加得到全局总个数,查询DSL如下:
GET /attach_info/_search { "size": 0, "aggs": { "total_attachments": { "sum": { "script": "params._source.attachments.length" } } } }
返回结果中aggregations.total_attachments.value即为全局总个数,对应示例返回值为5。
2. 按文档ID统计对应attachments数组元素个数
如果需要查询指定ID的数组长度,可先通过terms过滤目标ID,再按ID分组聚合计算每组的数组长度,查询DSL如下:
GET /attach_info/_search { "size": 0, "query": { "terms": { "id": ["AT23456", "AT23458"] } }, "aggs": { "group_by_doc_id": { "terms": { "field": "id.keyword", "size": 1000 }, "aggs": { "attach_count": { "sum": { "script": "params._source.attachments.length" } } } } } }
注意:如果你的id字段本身就是keyword类型,可将聚合的field值改为
id。
返回结果中aggregations.group_by_doc_id.buckets下每个bucket的key为文档ID,attach_count.value为对应文档的attachments数组长度,对应示例中AT23456返回2、AT23458返回3。
性能优化提示
如果该统计是高频查询,建议写入文档时直接新增attach_count字段存储attachments数组长度,查询时直接对该字段做聚合,性能远高于动态脚本计算。
内容的提问来源于stack exchange,提问作者RahulG
相关产品推荐
相关产品推荐

