我的文档首先只包含" url"(已分析)和" respsize"(not_analyzed)字段。我想更新与网址匹配的文档并添加新字段" category" 我的意思是; 首先是doc1:
{
"url":"http://stackoverflow.com/users/4005632/mehmet-yener-yilmaz",
"respsize":"500"
}
我有外部数据,我知道" stackoverflow.com"属于第10类, 我需要更新文档,并使其像:
{
"url":"http://stackoverflow.com/users/4005632/mehmet-yener-yilmaz",
"respsize":"500",
"category":"10"
}
当然我会做这个url字段所有的文件" stackoverflow.com" 我需要更新每个doc oly一次..因为url的类别数据不可更改,不需要再次更新。 我需要使用_update api和_version数来检查它,但不能编写dsl查询。 的修改 我运行这个看起来很好: 但文件没有改变..
虽然查询结果看起来是真的,但是新的字段没有添加到docs,还需要刷新等等吗?
答案 0 :(得分:33)
您可以使用update by query plugin来做到这一点。我们的想法是选择没有category
且url
与某个字符串匹配的所有文档,并添加您想要的类别。
curl -XPOST 'localhost:9200/webproxylog/_update_by_query' -d '
{
"query": {
"filtered": {
"filter": {
"bool": {
"must": [
{
"term": {
"url": "stackoverflow.com"
}
},
{
"missing": {
"field": "category"
}
}
]
}
}
}
},
"script" : "ctx._source.category = \"10\";"
}'
运行此操作后,url: stackoverflow.com
所有没有类别的文档将获得category: 10
。您可以稍后再次运行相同的查询来修复在此期间已编入索引的新stackoverflow.com
文档。
还要确保在elasticsearch.yml
中启用脚本并重新启动ES:
script.inline: on
script.indexed: on
在脚本中,您可以随意添加任意数量的字段,例如
...
"script" : "ctx._source.category1 = \"10\"; ctx._source.category2 = \"20\";"
<强>更新强>
ES 2.3现在具有update by query功能。您仍然可以完全按原样使用上述查询,但它可以使用(除了filtered
和missing
已弃用,但仍在使用;)。
答案 1 :(得分:0)
这一切听起来不错但只是为了添加@Val答案,可以从ElasticSearch 2.x获得Update By Query,但不能用于早期版本。在我们的情况下,由于遗留原因我们使用1.4,并且在可预见的未来无法升级,因此另一种解决方案是使用此处提供的查询更新插件:https://github.com/yakaz/elasticsearch-action-updatebyquery