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

时间:2015-10-04 08:58:29

标签: elasticsearch

我的文档首先只包含" 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查询。 的修改 我运行这个看起来很好: enter image description here 但文件没有改变.. enter image description here

虽然查询结果看起来是真的,但是新的字段没有添加到docs,还需要刷新等等吗?

2 个答案:

答案 0 :(得分:33)

您可以使用update by query plugin来做到这一点。我们的想法是选择没有categoryurl与某个字符串匹配的所有文档,并添加您想要的类别。

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功能。您仍然可以完全按原样使用上述查询,但它可以使用(除了filteredmissing已弃用,但仍在使用;)。

答案 1 :(得分:0)

这一切听起来不错但只是为了添加@Val答案,可以从ElasticSearch 2.x获得Update By Query,但不能用于早期版本。在我们的情况下,由于遗留原因我们使用1.4,并且在可预见的未来无法升级,因此另一种解决方案是使用此处提供的查询更新插件:https://github.com/yakaz/elasticsearch-action-updatebyquery