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

Replacing (Bulk Update) Nested documents in ElasticSearch

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

以下是映射的摘要(" bookingInfo"中的可用日期):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
{
  "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的更新调用?

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

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

我发现了这个似乎相关的问题,想知道以下内容是否可以工作(首先通过版本1.6的配置文件中的script.inline: on启用脚本):

1
2
3
4
5
6
curl -XPOST localhost:9200/the-index-and-property-here/_update -d '{
   "script" :"ctx._source.bookingInfo = updated_bookingInfo",
   "params" : {
       "updated_bookingInfo" : {"field":"bookingInfo"}
    }
}'
  • 我该如何将其转换为以上内容的批量调用?

使用ElasticSearch 1.7,这就是我解决它的方法。我希望它对某人有帮助,以备将来参考。

1
2
3
{"update": {"_id":"abcd1234","_retry_on_conflict" : 3} }\

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

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