根据 Elasticsearch 中的现有字段创建字段

时间:2020-12-22 05:57:27

标签: elasticsearch

我有一个 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 负责其余的工作。

所以,我不确定这是否可行,或者我应该从哪里开始。任何建议或提示表示赞赏!

0 个答案:

没有答案