我有一个带有度假租赁(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"}
}
}'
答案 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
...等等批量更新调用中的每个条目。