如果属性不存在elasticsearch,则向现有文档添加其他属性

时间:2017-12-13 13:10:45

标签: elasticsearch

我有一个特定的要求,我必须为弹性搜索索引添加一个附加属性,该索引有n个文档。仅当文档不包含属性时才必须执行此操作。这项任务基本上涉及两个步骤

1)搜索 2)更新

我知道如何使用多个查询执行此操作。但如果我设法在一个查询中执行此操作,那将会很棒。可能吗?如果是,有人可以告诉我如何做到这一点。

1 个答案:

答案 0 :(得分:1)

您可以使用update by query结合exists查询来更新新字段并将其添加到仅包含该属性的文档中。

例如,您只有一个文档包含字段attrib2,其他文档没有该字段。

curl -XPUT "http://localhost:9200/my_test_index/doc/1" -H 'Content-Type: application/json' -d'
{
  "attrib1": "value1"
}'
curl -XPUT "http://localhost:9200/my_test_index/doc/2" -H 'Content-Type: application/json' -d'
{
  "attrib1": "value21"
}'
curl -XPUT "http://localhost:9200/my_test_index/doc/3" -H 'Content-Type: application/json' -d'
{
  "attrib1": "value31",
  "attrib2": "value32"
}'

以下update by query将完成这项工作。

curl -XPOST "http://localhost:9200/my_test_index/_update_by_query" -H 'Content-Type: application/json' -d'
{
  "script": {
    "lang": "painless",
    "source": "ctx._source.attrib2 = params.attrib2",
    "params": {
      "attrib2": "new_value_for_attrib2"
    }
  },
  "query": {
    "bool": {
      "must_not": [
        {
          "exists": {
            "field": "attrib2"
          }
        }
      ]
    }
  }
}'

只会在那些尚未包含该字段的文档中将新值new_value_for_attrib2设置为字段attrib2