Py学习  »  Elasticsearch

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

Typewar • 5 年前 • 678 次点击  

我有一个简单的问题。

我正在尝试将“标记”附加到ElasticSearch数组中。

我发现在ElasticSearch中很难完全理解脚本函数,但找到了两个执行该任务的查询,但都必须调用。这意味着php(在我的例子中)必须向elasticsearch数据库发送两个post请求,我认为 可以 长期存在一些问题。

我认为只在一个查询中发送所有信息会更安全。

下面的查询是为了更新 votes 调用的数组 tags 1 ,为了 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
    }
  }
}

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

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

在一个查询中,是否有任何方法可以轻松地将这两个脚本组合在一起?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/30720
 
678 次点击  
文章 [ 1 ]  |  最新文章 5 年前
Nishant Saini
Reply   •   1 楼
Nishant Saini    5 年前

你可以使用 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}}}}