更新弹性搜索文档

时间:2016-07-28 04:39:16

标签: elasticsearch

此代码按预期工作。但我没有将第三个国家添加为另一个文档,而是想更新第一个文档。

DELETE /test_index

PUT /test_index

PUT /test_index/doc/1
{
   "parent": [
      {
         "name": "India",
         "label": "IN"
      },
      {
         "name": "China",
         "label": "CN"
      }
   ]
}

PUT /test_index/doc/2
{
   "parent": [
      {
         "name": "Pakistan",
         "label": "PK"
      }
   ]
}

因此,文件ID 1将有3个国家印度,中国和巴基斯坦。我想我需要使用doc_as_upsert参数更新API。但我不确定如何编写JSON。

2 个答案:

答案 0 :(得分:1)

您可以使用update API

更新脚本
curl -XPOST 'localhost:9200/test_index/doc/1/_update' -d '{
    "script" : {
        "inline": "ctx._source.parent += ['name': name, 'label': label]",
        "params" : {
            "name" : "Pakistan",
            "label": "PK"
        }
    }
}'

<强>更新

如果要在批量查询中使用它,也可以

curl -XPOST 'localhost:9200/test_index/doc/_bulk' -d '
{ "update" : { "_id" : "1"} }
{ "script" : { "inline": "ctx._source.parent += ['name': name, 'label': label]", "lang" : "groovy", "params" : {"name" : "Pakistan", "label": "PK"}}}
'

答案 1 :(得分:0)

添加到val的答案,如果文档尚不存在,我可以使用upsert。

POST /test_index/doc/1/_update
{
   "script": {
      "inline": "ctx._source.parent += ['name': name, 'label': label]",
      "params": {
         "name": "Pakistan",
         "label": "PK"
      }
   },
   "upsert": {"parent" : [{
      "name": "Pakistan",
      "label": "PK"
   }]
   }
}

<强>更新

使用upsert的批量API看起来像这样......

POST /test_index/doc/_bulk
{ "update" : { "_id" : "1"} }
{ "script" : { "inline": "ctx._source.parent += ['name': name, 'label': label]", "lang" : "groovy", "params" : {"name" : "Pakistan", "label": "PK"}}, "upsert": {"parent" : [{"name": "Pakistan", "label": "PK" }] }}