是否可以在Elasticsearch中运行两个脚本而不是发送两个查询?

时间:2019-02-11 04:28:05

标签: arrays elasticsearch

我有一个简单的问题。

我正在尝试将“标签”附加到Elasticsearch数组。

我发现很难全神贯注于Elasticsearch中的脚本功能,但是发现有两个查询可以完成工作,但是都必须调用。这意味着PHP(以我为例)必须向Elasticsearch数据库发送两个POST请求,我认为这可能会长期造成某些问题。

我认为在一个查询中将其全部发送会更安全。

下面的查询是将名为votes的数组的tags1更新为2。我敢肯定,有比我更好的方法了。

这是我使用的查询:

我不确定为什么votes: 2在那里,但是似乎可以完成删除标签的工作。就像我说的那样,我发现很难全神贯注于Elasticsearch中的脚本。

POST /db2/links/1/_update
{
  "script": {
    "inline": "for(int i=0;i<ctx._source.tags.size();i++){if(ctx._source.tags[i].name==\"tagname\"){ctx._source.tags.remove(i)}}",
    "params": {
      "votes": 2
    }
  }
}

此查询用于将标签附加到文档的tags数组

POST /db2/links/1/_update
{
  "script": {
    "inline": "ctx._source.tags.add(params.appendtags)",
    "params": {
      "appendtags": {
        "name": "tagname",
        "votes": 2
      }
    }
  }
}

有什么方法可以在一个查询中轻松地将这两个脚本组合在一起?

1 个答案:

答案 0 :(得分:0)

您可以使用bulk api在一个呼叫中进行多个更新。

POST _bulk
{"update":{"_id":"1","_type":"links","_index":"db2","retry_on_conflict":3}}
{"script":{"inline":"for(int i=0;i<ctx._source.tags.size();i++){if(ctx._source.tags[i].name==\"tagname\"){ctx._source.tags.remove(i)}}","params":{"votes":2}}}
{"update":{"_id":"1","_type":"links","_index":"db2","retry_on_conflict":3}}
{"script":{"inline":"ctx._source.tags.add(params.appendtags)","params":{"appendtags":{"name":"tagname","votes":2}}}}
相关问题