最近,我决定尝试将现有的非规范化索引重新索引为具有父-chid关系的新索引。我有大约1400万个家长文档,每个家长最多有400个孩子。(总共大约2.7亿个文档)
这是映射->的简化版本
{
"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作为连接关系,以提高搜索性能。
(根据我的理解,这会导致全局序数中的某些连接关系计算是在索引时间内完成的,而不是在查询时完成)。
这个迁移过程帮助我将索引大小从大约500 to减少到只有40 to。它对我的用例有很大的好处,因为我每天更新很多数据。
我目前的测试环境是使用单个节点,索引只有一个主碎片。试图运行下面的聚合,似乎它永远运行-
{
"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分钟后,但它似乎永远运行。
我很想在这里得到一些帮助,谢谢。
发布于 2022-10-11 07:51:27
问题似乎是使用单个碎片,通过增加主碎片的# (1->4),我成功地获得了一些性能提升,但它仍然运行非常(!)很长时间了。
似乎父子关系查询性能不符合我的要求,所以我尝试使用嵌套对象-通过这样做更新/索引时间将增加,但我将获得搜索/聚合性能提升。
https://stackoverflow.com/questions/73599830
复制相似问题