我的文档结构如下:
{
"documentID": 123,
"originalFilename": "Build a Better Post.pdf",
"modDate": "2017-11-16T18:22:54.48",
"documentType": "pdf",
"keySystem": "web",
"title": "Build a Better Post",
"createPreview": false,
"uploadedBy": "DA5208B3-2198-44C6-8256-0AEBC4DD1588",
"streamItemData": {
"itemID": 800,
"author": {
"employeeID": 9,
"authorName": {
"firstName": "Joseph",
"preferredName": "Joe",
"lastName": "Smith"
},
"title": "manager"
}
}
}
我的elasticsearch 中有大约数百万个文档。一author对象可以存在于数千个文档中,基本上存在一对多的关系。
每当嵌套对象author已更新,说标题已更新我想更新包含此内容的所有文档author这可能是数百万份文档。有没有任何弹性搜索查询可以实现这一点。我知道应该有一个批量更新过程来处理这个问题,但是有什么方法可以让我不必查询包含该对象的所有文档,然后一一更新它们。
The _update_by_query终点 https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update-by-query.html这就是您正在寻找的。
下面的命令将识别作者的所有文档employeeID: 9
(你可以有任何你想要的条件),然后它将取代author
脚本参数中的字段:
POST your-index/_update_by_query?wait_for_completion=false&slices=auto&conflicts=proceed
{
"script": {
"source": "ctx._source.streamItemData.author.putAll(params)",
"lang": "painless",
"params": {
"authorName": {
"firstName": "Joseph",
"preferredName": "Joe",
"lastName": "Smith"
},
"title": "manager"
}
},
"query": {
"term": {
"streamItemData.author.employeeID": "9"
}
}
}
由于您可能愿意更新数百万个文档,因此我添加了wait_for_completion=false
到 URL,以便更新异步运行。您可以在任务运行时使用以下命令检查任务任务管理API https://www.elastic.co/guide/en/elasticsearch/reference/current/tasks.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)