elasticsearch 聚合父子索引将永远运行

yb3bgrhw  于 2022-11-02  发布在  ElasticSearch
关注(0)|答案(1)|浏览(127)

我最近决定尝试将一个现有的反规范化索引重新索引为一个具有父-子关系的新索引。我有大约1400万个父文档,每个父文档有多达400个子文档。(总共大约27000万个文档)
这是我的Map的简化版本-〉

{
  "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"
        }
      }
    }
  }
}

正如您所看到的,我对连接关系使用了eager_global_ordinals,以加快搜索性能
(per我的理解是,这会导致全局序数中的一些连接关系计算在索引时完成,而不是在查询时完成)。
这个迁移过程帮助我将索引大小从大约500 GB减少到了40 GB。这对我的用例有很大的好处,因为我每天都要更新很多数据。
我当前的测试环境使用的是单个节点,索引只有1个主碎片。尝试运行以下聚合,似乎它会永远运行下去-

{
  "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"
          }
        }
      ]
    }
  }
}

我理解亲子关系的缺点,但似乎我做错了什么。我本希望得到一些结果,即使在15分钟后,但它似乎永远运行。
我很想得到一些帮助,谢谢。

g9icjywg

g9icjywg1#

看起来问题是使用单个碎片,通过增加主碎片的数量(1-〉4),我已经设法获得了一些性能提升,但它仍然运行了非常(!)长的时间。
看起来父子关系查询性能不符合我的要求,所以我尝试使用嵌套对象代替-这样做更新/索引时间会增加,但我会获得搜索/聚合性能的提升。

相关问题