我刚开始使用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的计数字段值。例如,在上述情况下,如果 ref_name 是“ test1 ”,我希望新 计数 为 500 。我想出了下面的简单 脚本 来更改 计 数值,它可以正常执行而没有任何错误,但是我看不到该值正在更新。
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更新查询)
Bulk update
per document
核心逻辑在中script,这在两个查询中都相同。
script
我建议您按照逻辑进行自我解释。基本上,脚本会遍历嵌套文档,并根据您指定的条件对其进行count相应的更新。
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 } } }
希望对您有所帮助,如有任何疑问,请与我们联系!