父子关系索引聚合任务无限运行问题求助
父子索引聚合查询超时排查
近期将非规范化索引重构为父子关系索引,包含约14M父文档(product_data类型),每个父文档最多关联400个子文档(kpi/customer类型),总文档数约270M。重构后索引大小从500GB降至40GB,适配高频数据更新场景。已为join字段relation_type开启eager_global_ordinals,提前计算全局序数以优化查询性能。
简化后索引映射
{ "mappings": { "_doc": { "properties": { "product_type": { "type": "keyword" }, "relation_type": { "type": "join", "eager_global_ordinals": true, "relations": { "product_data": [ "kpi", "customer" ] } }, "rootdomain": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "rootdomain_sku": { "type": "keyword", "eager_global_ordinals": true }, "sales_1d": { "type": "float" }, "sku": { "type": "keyword", "eager_global_ordinals": true }, "timestamp": { "type": "date", "format": "strict_date_optional_time_nanos" } } } } }
问题场景
测试环境为单节点,索引仅配置1个主分片。运行以下聚合查询时,任务无限运行,等待15分钟以上无结果:
{ "aggs": { "skus_sales": { "aggs": { "sales1": { "children": { "type": "kpi" }, "aggs": { "sales2": { "filter": { "range": { "timestamp": { "format": "basic_date_time_no_millis", "gte": "20220601T000000Z", "lte": "20220605T235959Z" } } }, "aggs": { "sales3": { "sum": { "field": "sales_1d" } } } } } } }, "terms": { "field": "rootdomain_sku", "size": 10 } } }, "query": { "bool": { "filter": [ { "term": { "rootdomain.keyword": "some_domain" } }, { "term": { "product_type": "Rugs" } } ] } } }
排查与优化建议
- 调整分片策略:单主分片承载270M文档的父子聚合计算压力过大,建议拆分主分片(如设置
number_of_shards: 8或16)。同时写入时指定routing为父文档ID或rootdomain_sku,确保父子文档落在同一分片,避免跨分片关联的额外开销。 - 优化聚合顺序:原查询先按
rootdomain_sku分桶,再对每个桶关联子文档计算,会导致大量无效关联。可先过滤符合时间范围的子文档,再通过parent聚合关联父文档,最后按rootdomain_sku分桶求和,提前缩小计算范围:
{ "query": { "bool": { "filter": [ { "term": { "relation_type": "kpi" } }, { "range": { "timestamp": { "format": "basic_date_time_no_millis", "gte": "20220601T000000Z", "lte": "20220605T235959Z" } } }, { "has_parent": { "parent_type": "product_data", "query": { "bool": { "filter": [ { "term": { "rootdomain.keyword": "some_domain" } }, { "term": { "product_type": "Rugs" } } ] } } } } ] } }, "aggs": { "skus_sales": { "terms": { "field": "rootdomain_sku", "size": 10 }, "aggs": { "total_sales": { "sum": { "field": "sales_1d" } } } } } }
- 检查资源配置:单节点的CPU、堆内存、磁盘IO可能成为瓶颈。确保堆内存分配合理(建议为物理内存的50%,不超过32GB),设置
indices.fielddata.cache.size: 20%为fielddata缓存预留足够空间,同时监控节点CPU使用率、磁盘IO等待时间,排查硬件资源是否耗尽。 - 验证全局序数生效:虽然开启了
eager_global_ordinals,但需确认索引刷新后全局序数已提前构建。可通过GET /_cat/indices?v&h=index,settings.mapping.relation_type.eager_global_ordinals验证配置,或查看节点日志确认全局序数构建过程无异常。
内容的提问来源于stack exchange,提问作者Tomer.Ov
相关产品推荐
相关产品推荐

