基于elasticsearch中的现有字段创建字段

ws51t4hk  于 2021-06-13  发布在  ElasticSearch
关注(0)|答案(0)|浏览(220)

我有一个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来处理。
所以,我不确定这是否可行,或者我应该从哪里开始。任何建议或暗示都将不胜感激!

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题