You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Elasticsearch:如何按文档统计列表字段中值的出现次数

统计嵌套数组字段中不同值的出现次数

你的问题出在Elasticsearch默认会扁平化数组,直接用terms聚合只会统计每个color在文档中的存在次数,而非数组内的重复出现次数。要实现按page分组并统计每组内color的重复次数,需要结合**嵌套类型(nested)**和嵌套聚合来处理,步骤如下:

1. 确保索引映射为嵌套类型

首先需要将colors字段设置为nested类型,避免数组被扁平化。示例映射:

PUT /your_index
{
  "mappings": {
    "properties": {
      "page": { "type": "integer" },
      "colors": {
        "type": "nested",
        "properties": {
          "color": { "type": "keyword" }
        }
      }
    }
  }
}

2. 执行嵌套聚合查询

使用多层聚合先按page分桶,再进入嵌套上下文统计color的出现次数:

POST /your_index/_search
{
  "size": 0,
  "aggs": {
    "group_by_page": {
      "terms": {
        "field": "page",
        "size": 10
      },
      "aggs": {
        "nested_colors": {
          "nested": {
            "path": "colors"
          },
          "aggs": {
            "color_count": {
              "terms": {
                "field": "colors.color",
                "size": 10
              }
            }
          }
        }
      }
    }
  }
}

查询说明:

  • group_by_page:按page字段分桶,将同页的文档归为一组。
  • nested_colors:进入colors嵌套字段的上下文,确保能正确遍历数组中的每个元素。
  • color_count:在嵌套上下文中对colors.color做terms聚合,此时统计的就是该page下每个color在数组内的实际出现次数。

3. 转换为期望的输出格式

Elasticsearch的聚合结果结构需要在应用层做简单转换,以Python为例:

from elasticsearch import Elasticsearch

es = Elasticsearch()
search_response = es.search(index="your_index", body={
  "size": 0,
  "aggs": {
    "group_by_page": {
      "terms": {
        "field": "page",
        "size": 10
      },
      "aggs": {
        "nested_colors": {
          "nested": {
            "path": "colors"
          },
          "aggs": {
            "color_count": {
              "terms": {
                "field": "colors.color",
                "size": 10
              }
            }
          }
        }
      }
    }
  }
})

formatted_result = []
for page_bucket in search_response['aggregations']['group_by_page']['buckets']:
    page_entry = {
        "page": page_bucket['key'],
        "colors_count": []
    }
    for color_bucket in page_bucket['nested_colors']['color_count']['buckets']:
        page_entry['colors_count'].append({
            "Key": color_bucket['key'],
            "Count": color_bucket['doc_count']
        })
    formatted_result.append(page_entry)

print(formatted_result)

运行这段代码后,就能得到你期望的输出结构。

内容的提问来源于stack exchange,提问作者ahmad.benmaallem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 06:40:20