【问题标题】:How to update multiple documents that match a query in elasticsearch如何更新与弹性搜索中的查询匹配的多个文档
【发布时间】:2016-01-01 02:46:09
【问题描述】:

我的文档一开始只包含“url”(已分析)和“respsize”(not_analyzed)字段。我想更新与 url 匹配的文档并添加新字段“类别” 我是说; 首先是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”的所有文档中执行此操作 我需要更新每个文档一次..因为url的类别数据是不可更改的,不需要再次更新。 我需要使用带有 _version 号的 _update api 来检查它,但无法编写 dsl 查询。 编辑 我运行它并且看起来工作正常: 但文件没有改变..

虽然查询结果看起来不错,但新字段未添加到文档中,需要刷新等?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    您可以使用update by query plugin 来做到这一点。我们的想法是选择所有没有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\";"
    }'
    

    运行此程序后,您所有带有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 已弃用,但仍然有效;)。

    【讨论】:

    • 您的更新查询中的第一个 term 应位于字段 heroname 而不是 url。屏幕截图似乎与您问题中的初始文档没有任何共同之处。
    • 其分析的真实现场数据 Wrath King 和 SAND KING 但我可以使用 term:"king" 获取这些文档
    • 是的,您可以使用相同的脚本。我正在更新答案。
    • ES 2.3 现在具有update by query 功能!!
    • 我一直在尝试这样做,但我不断收到以下错误:{"error":{"root_cause":[{"type":"class_cast_exception","reason":"java.lang.String cannot be cast to java.util.Map"}],"type":"class_cast_exception","reason":"java.lang.String cannot be cast to java.util.Map"},"status":500} 我不明白为什么会抛出此错误。你能指出我正确的方向吗?
    【解决方案2】:

    这一切听起来都很棒,但只是为了添加到@Val 答案,按查询更新可从 ElasticSearch 2.x 获得,但不适用于早期版本。在我们的例子中,由于遗留原因,我们使用 1.4,并且在可预见的将来没有升级的机会,因此另一种解决方案是使用此处提供的按查询更新插件:https://github.com/yakaz/elasticsearch-action-updatebyquery

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-09
      • 1970-01-01
      • 2014-06-02
      • 1970-01-01
      • 2020-11-20
      • 1970-01-01
      • 1970-01-01
      • 2013-01-15
      相关资源
      最近更新 更多