我有一个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
等等。
因此,我在我的应用程序中实现了一个规范化步骤,它实现了这样一个简单的Map(为了简单起见,这里的Map只是一个ruby散列,实际上Map是从数据库读取的):
PROPERTY_MAPPING = {
"Colour_blue" => ["Color", "blue"],
"Color_light-blue" => ["Color", "blue"],
"Size_46" => ["Size", "S"]
}
当我的应用程序索引一个产品时,它会查看这个属性Map并规范化属性。这将保持字段的基数较低,并且不会向用户显示太多要过滤的属性。
问题是:更新这些Map相当慢,因为我必须通过在我的应用程序中应用新Map并将数据发送到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)看了看无痛的。
主要的想法是只更新Map,做一个 update_by_query
,剩下的就让elasticsearch来处理。
所以,我不确定这是否可行,或者我应该从哪里开始。任何建议或暗示都将不胜感激!
暂无答案!
目前还没有任何答案,快来回答吧!