我的文档首先只包含"url"(已分析)和"respsize"(not_analyzed)字段.我想更新与网址匹配的文档,并添加新字段"类别",我的意思是; 在第一个doc1:
{
"url":"http://stackoverflow.com/users/4005632/mehmet-yener-yilmaz",
"respsize":"500"
}
Run Code Online (Sandbox Code Playgroud)
我有一个外部数据,我知道"stackoverflow.com"属于类别10,我需要更新文档,并使其像:
{
"url":"http://stackoverflow.com/users/4005632/mehmet-yener-yilmaz",
"respsize":"500",
"category":"10"
}
Run Code Online (Sandbox Code Playgroud)
当然我会做这个url字段有"stackoverflow.com"的所有文件,我需要每次更新每个文档一次..因为url的类别数据不可更改,不需要再次更新.我需要使用_update api和_version数来检查它,但不能编写dsl查询.
编辑
我运行这个看起来很好:
但文件没有改变..

虽然查询结果看起来是真的,但新的字段没有添加到docs,需要刷新等等?
Val*_*Val 47
您可以使用查询插件更新来执行此操作.我们的想法是选择所有没有a的文档,category并且url匹配某个字符串并添加你想要的类别.
curl -XPOST 'localhost:9200/webproxylog/_update_by_query' -H "Content-Type: application/json" -d '
{
"query": {
"filtered": {
"filter": {
"bool": {
"must": [
{
"term": {
"url": "stackoverflow.com"
}
},
{
"missing": {
"field": "category"
}
}
]
}
}
}
},
"script" : "ctx._source.category = \"10\";"
}'
Run Code Online (Sandbox Code Playgroud)
运行此操作后url: stackoverflow.com,将获得所有没有类别的文档category: 10.您可以稍后再次运行相同的查询来修复stackoverflow.com在此期间已编入索引的新文档.
还要确保启用脚本elasticsearch.yml并重新启动ES:
script.inline: on
script.indexed: on
Run Code Online (Sandbox Code Playgroud)
在脚本中,您可以随意添加任意数量的字段,例如
...
"script" : "ctx._source.category1 = \"10\"; ctx._source.category2 = \"20\";"
Run Code Online (Sandbox Code Playgroud)
UPDATE
ES 2.3现在具有按查询功能更新的功能.您仍然可以完全按原样使用上述查询,它将起作用(除了filtered并且missing已弃用,但仍在工作;).
| 归档时间: |
|
| 查看次数: |
35902 次 |
| 最近记录: |