我最近决定尝试将一个现有的反规范化索引重新索引为一个具有父-子关系的新索引。我有大约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分钟后,但它似乎永远运行。
我很想得到一些帮助,谢谢。
1条答案
按热度按时间g9icjywg1#
看起来问题是使用单个碎片,通过增加主碎片的数量(1-〉4),我已经设法获得了一些性能提升,但它仍然运行了非常(!)长的时间。
看起来父子关系查询性能不符合我的要求,所以我尝试使用嵌套对象代替-这样做更新/索引时间会增加,但我会获得搜索/聚合性能的提升。