Elasticsearch experience非嵌套聚合报错:nested设置与brand、company复合聚合实现
索引配置调整步骤
- 核心规则:Elasticsearch 不允许对已存在数据的索引直接修改已有字段的类型,之前直接修改映射失败,就是因为违反了这个机制。要将数组对象字段设置为nested类型,必须走「新建带正确映射的索引+数据迁移」的流程:
- 创建新索引,在映射中显式将
experience字段声明为nested类型,保留原有所有子字段的配置不变,示例创建命令:
PUT user_data1_nested { "mappings": { "properties": { "creation_date": {"type": "date"}, "current_position": { "properties": { "position": {"type": "text", "fields": {"keyword": {"type": "keyword", "ignore_above": 256}}}, "position_category": {"type": "text", "fields": {"keyword": {"type": "keyword", "ignore_above": 256}}}, "position_level": {"type": "long"} } }, "experience": { "type": "nested", "properties": { "brand": {"type": "text", "fields": {"keyword": {"type": "keyword", "ignore_above": 256}}}, "brand_segment": {"type": "text", "fields": {"keyword": {"type": "keyword", "ignore_above": 256}}}, "company": {"type": "text", "fields": {"keyword": {"type": "keyword", "ignore_above": 256}}}, "duration": {"type": "text", "fields": {"keyword": {"type": "keyword", "ignore_above": 256}}}, "property_type": {"type": "text", "fields": {"keyword": {"type": "keyword", "ignore_above": 256}}}, "real_estate_type": {"type": "text", "fields": {"keyword": {"type": "keyword", "ignore_above": 256}}} } }, "id": {"type": "long"}, "last_updation_date": {"type": "date"}, "name": {"type": "text", "fields": {"keyword": {"type": "keyword", "ignore_above": 256}}}, "profile_complition": {"type": "text", "fields": {"keyword": {"type": "keyword", "ignore_above": 256}}}, "seeking_position": { "properties": { "position": {"type": "text", "fields": {"keyword": {"type": "keyword", "ignore_above": 256}}}, "position_category": {"type": "text", "fields": {"keyword": {"type": "keyword", "ignore_above": 256}}}, "position_level": {"type": "long"} } }, "source": {"type": "text", "fields": {"keyword": {"type": "keyword", "ignore_above": 256}}} } }, "settings": { "number_of_shards": 1, "number_of_replicas": 1 } }- 执行reindex命令,将旧索引
user_data1中的全量文档迁移到新建的user_data1_nested索引中:
POST _reindex { "source": {"index": "user_data1"}, "dest": {"index": "user_data1_nested"} }- 执行
GET user_data1_nested/_mapping校验配置,确认experience字段的类型为nested即完成配置。
- 创建新索引,在映射中显式将
分层聚合查询编写
针对nested类型的字段做聚合,需要满足两个硬性要求:
- 必须先通过nested聚合切入到对应的数组路径作用域,不能直接从顶层查询字段
- 聚合时必须指定字段的
keyword子字段(因为主字段是text类型,默认不支持聚合)
可直接运行的聚合查询如下:
GET user_data1_nested/_search { "size": 0, "aggs": { "experience_nested_scope": { "nested": {"path": "experience"}, "aggs": { "group_by_brand": { "terms": {"field": "experience.brand.keyword"}, "aggs": { "group_by_company": { "terms": {"field": "experience.company.keyword"} } } } } } } }
和普通object存储模式不同,nested类型会将每个experience数组元素作为独立的隐藏文档存储,能够严格保留单条记录内brand和company的绑定关系,不会出现字段值交叉错配的问题,可准确统计每个brand分组下对应的所有company的关联数据。
内容的提问来源于stack exchange,提问作者Richesh Chouksey
相关产品推荐
相关产品推荐

