Elasticsearch:通过将元素插入其数组字段来更新现有文档

时间:2015-09-24 19:50:21

标签: groovy elasticsearch

考虑以下文件

{
  "title":  "My first blog entry",
  "text":   "Starting to get the hang of this...",
  "tags": [ "testing" ], 
  "views":  0 
}

我需要运行一种upsert操作。如果我遇到像

这样的数据
{
    "id": 1,
    "tags": [ "new tag" ]
}

我想更新具有相同ID的现有文档。所以结果应该是:

{
    "id": 1,
    "title":  "My first blog entry",
    "text":   "Starting to get the hang of this...",
    "tags": [ "testing", "new tag" ], 
    "views":  0 
}

如果不存在具有相同ID的文档,我想创建一个新文档。

现在在像mongoDB这样的数据库中,我可以使用$ addToSet或$ push操作进行更新。我在Elasticsearch中找不到类似的操作。

我读到可以通过在groovy中编写脚本来完成。但是,这需要在包含2亿条记录的文件上完成。我不确定我是否可以将groovy与批量API结合使用。有可能吗?

1 个答案:

答案 0 :(得分:6)

您不需要为此使用批量API。您可以使用upsert request。 Upsert请求也可以嵌入批量请求中。

curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{
  "script": "if (ctx._source.tags.contains(\"tags\")) {ctx._source.tags += tag;} else {ctx._source.tags = [tag]}",
  "params": {
    "tag": "newTag"
  },
  "upsert": {
    "title": "My first blog entry",
    "text": "Starting to get the hang of this...",
    "tags": [
      "newTag"
    ],
    "views": 0
  }
}'