我有一个简单的问题。
我正在尝试将“标签”附加到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
}
}
}
此查询用于将标签附加到文档的tags
数组
POST /db2/links/1/_update
{
"script": {
"inline": "ctx._source.tags.add(params.appendtags)",
"params": {
"appendtags": {
"name": "tagname",
"votes": 2
}
}
}
}
有什么方法可以在一个查询中轻松地将这两个脚本组合在一起?
答案 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}}}}