如何更新与elasticsearch中的查询匹配的多个文档

25 elasticsearch

我的文档首先只包含"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已弃用,但仍在工作;).

  • 我一直在尝试这样做,但我不断收到以下错误:`{"error":{"root_cause":[{"type":"class_cast_exception","re​​ason":"java.lang.String cannot be cast to java.util.Map"}],"type":"class_cast_exception","re​​ason":"java.lang.String cannot be cast to java.util.Map"},"status":500}` 我不知道理解为什么会抛出这个错误。你能指出我正确的方向吗? (2认同)