我有一个 Elasticsearch 索引,用于存储产品及其作为动态字段的大小、颜色、材料等属性:
"raw_properties" : {
"dynamic" : "true",
"properties" : {
"Color" : {
"type" : "text",
"fields" : {
"keyword" : { "type" : "keyword", "ignore_above" : 256 }
}
},
"Size" : {
"type" : "text",
"fields" : {
"keyword" : { "type" : "keyword", "ignore_above" : 256
}
}
}
}
}
索引文档如下所示:
{
"_index" : "development-products",
"_type" : "_doc",
"_id" : "3",
"_score" : 1.0,
"_source" : {
"raw_properties" : {
"Size" : ["XS", "S", "XL"],
"Color" : ["blue", "orange"]
}
}
}
问题是,raw_properties
的值有多种来源,而且差异很大。例如,字段 Color
从另一个来源被称为 Colour
,而 blue
可以是 light-blue
,依此类推。
所以,我在我的应用程序中实现了一个规范化步骤,它做一个像这样的简单映射(为简单起见,这里的映射只是一个 Ruby 哈希,实际上映射是从数据库中读取的):
PROPERTY_MAPPING = {
"Colour_blue" => ["Color", "blue"],
"Color_light-blue" => ["Color", "blue"],
"Size_46" => ["Size", "S"]
}
当我的应用索引产品时,它会查看此属性映射并规范化该属性。这样可以将字段的基数保持在较低水平,并且不会向用户显示太多要过滤的属性。
问题:更新这些映射非常缓慢,因为我必须通过在我的应用程序中应用新映射并将数据发送到 Elasticsearch 来重新索引受影响的产品。我在这里处理大约 300 万种产品,每天都有新的标准化数据出现。我尝试只查找受影响的产品等等,但还是太慢了。
所以我在想是否有办法在 Elasticsearch 中进行规范化?我已经阅读了有关丰富数据 (https://www.elastic.co/guide/en/elasticsearch/reference/master/ingest-enriching-data.html) 或带有处理器的管道 (https://www.elastic.co/guide/en/elasticsearch/reference/master/ingest-processors.html) 的文章,并了解了 Painless。
主要想法是只更新映射,执行 update_by_query
,让 Elasticsearch 负责其余的工作。
所以,我不确定这是否可行,或者我应该从哪里开始。任何建议或提示表示赞赏!