在ElasticSearch中替换(批量更新)嵌套文档

时间:2015-07-27 09:14:24

标签: elasticsearch updates

我有一个带有度假租赁(100K +)的ElasticSearch索引,每个索引都包含一个属性,其中包含可用日期的嵌套文档(每个'父'文档1000+)。我需要定期(每天几次)替换每个属性的整套嵌套文档(为每个度假租赁属性提供新的可用数据) - 但ElasticSearch默认行为是合并嵌套文档。

以下是映射的片段(“bookingInfo”中的可用日期):

{
   "vacation-rental-properties": {
      "mappings": {
         "property": {
            "dynamic": "false",
            "properties": {
               "bookingInfo": {
                  "type": "nested",
                  "properties": {
                     "avail": {
                        "type": "integer"
                     },
                     "datum": {
                        "type": "date",
                        "format": "dateOptionalTime"
                     },
                     "in": {
                        "type": "boolean"
                     },
                     "min": {
                        "type": "integer"
                     },
                     "out": {
                        "type": "boolean"
                     },
                     "u": {
                        "type": "integer"
                     }
                  }
               },
               // this part left out
            }
        }
    }
}

不幸的是,我们当前的底层业务逻辑不允许我们替换或更新“bookingInfo”嵌套文档的部分,我们需要替换整个嵌套文档数组。使用默认行为,更新“父”文档,只是将新的嵌套文档添加到“bookingInfo”(除非它们存在,然后它们已更新) - 使索引留下许多旧日期,不再存在(如果他们在过去,他们无论如何都不能预订。)

如何进行ES的更新调用?

目前正在使用批量调用,例如(每个文档两行):

{ "update" : {"_id" : "abcd1234", "_type" : "property", "_index" : "vacation-rental-properties"} }
{ "doc" : {"bookingInfo" : ["all of the documents here"]} }

我找到了似乎相关的this question,并想知道以下内容是否有效(首先在1.6 +版本的配置文件中通过script.inline: on启用脚本):

curl -XPOST localhost:9200/the-index-and-property-here/_update -d '{
    "script" : "ctx._source.bookingInfo = updated_bookingInfo",
    "params" : {
        "updated_bookingInfo" : {"field": "bookingInfo"}
    }
}'
  • 如何将其转换为上述批量调用?

1 个答案:

答案 0 :(得分:0)

使用ElasticSearch 1.7,这是我解决它的方式。我希望它可以对某人有所帮助,作为未来的参考。

{ "update": { "_id": "abcd1234", "_retry_on_conflict" : 3} }\n
{ "script" : { "inline": "ctx._source.bookingInfo = param1", "lang" : "js", "params" : {"param1" : ["All of the nested docs here"]}}\n

...等等批量更新调用中的每个条目。