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的配置文件中的
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"]}}\ |
...等等,对于批量更新调用中的每个条目。