Elasticsearch无痛脚本不会使用if条件替换嵌套对象字段值

我刚开始使用ES,但仍然喜欢交易的技巧!!!我需要替换/覆盖嵌套对象类型的字段之一。这是示例文档:

{

"name":"db_ref",

"ref_counter":[

{"ref_name":"test1","count":1},

{"ref_name":"test2","count":2},

{"ref_name":"test3","count":3}

]

}

映射以上文档:

{

"settings": {

"mappings": {

"test_doc": {

"properties": {

"name": {

"type": "string"

},

"ref_count": {

"type": "nested",

"ref_name": "string",

"count": "long"

}

}

}

}

}

}

我需要更新给定ref_name的计数字段值。例如,在上述情况下,如果 是“ ”,我希望新 为

。我想出了下面的简单 脚本 来更改 数值,它可以正常执行而没有任何错误,但是我看不到该值正在更新。

curl -XPOST "http://localhost:9200/test_type/test_type/test_db/_update" -d '

{"script": "if (ctx._source.ref_counter.ref_name == cur_ref

&& ctx._source.ref_counter.count == cur_count)

{ctx._source.ref_counter.count = new_count };",

"params": {"cur_count": 1,"new_count": 500, "cur_ref": "test1"}}}'

以下是响应:

{"_index":"test_index","_type":"test_type","_id":"test_db","_version":2}

但是,当我看到该文档时,它仍然具有旧值。

有人可以帮我将计数值更改为新值吗?

回答:

我已经提到了以下查询。(Bulk update查询和per document更新查询)

核心逻辑在中script,这在两个查询中都相同。

我建议您按照逻辑进行自我解释。基本上,脚本会遍历嵌套文档,并根据您指定的条件对其进行count相应的更新。

回答:

POST <your_index_name>/_update_by_query

{

"query": {

"match_all": {}

},

"script": {

"lang": "painless",

"source": """

if(ctx._source.ref_counter.contains(params.cur_data)){

for(int i=0; i<ctx._source.ref_counter.size(); i++)

{

HashMap myKV = ctx._source.ref_counter.get(i);

if(myKV.get(params.key_ref)==params.key_ref_value){

myKV.put(params.key_count, params.key_count_value_new);

}

}

//ctx._source.ref_counter.add(params.new_data);

}""",

"params": {

"cur_data": { "ref_name": "test2", "count": 2},

"new_data": { "ref_name": "test2", "count": 22},

"key_ref": "ref_name",

"key_ref_value": "test2",

"key_count": "count",

"key_count_value_new": 80

}}

}

回答:

POST <your_index_name>/<your_mapping>/1/_update

{

"script": {

"lang": "painless",

"source": """

if(ctx._source.ref_counter.contains(params.cur_data)){

for(int i=0; i<ctx._source.ref_counter.size(); i++)

{

HashMap myKV = ctx._source.ref_counter.get(i);

if(myKV.get(params.key_ref)==params.key_ref_value){

myKV.put(params.key_count, params.key_count_value_new);

}

}

//ctx._source.ref_counter.add(params.new_data);

}""",

"params": {

"cur_data": { "ref_name": "test2", "count": 2},

"new_data": { "ref_name": "test2", "count": 22},

"key_ref": "ref_name",

"key_ref_value": "test2",

"key_count": "count",

"key_count_value_new": 80

}

}

}

希望对您有所帮助,如有任何疑问,请与我们联系!

以上是 Elasticsearch无痛脚本不会使用if条件替换嵌套对象字段值 的全部内容, 来源链接: utcz.com/qa/427284.html

回到顶部