ElasticSearch之updateByQuery使用

#背景

有时需要通过某些查询条件,更新文档某一个字段,这样的诉求,用SQL表达就是update t_student set class=’优秀的小男生’ where age = 10 and score = 100 and sex = 1。ES有updateByQuery API 和 deleteByQuery API,这样一条DSL就可以搞定类似的需求。

例子

批量更新id = 9627361的文档,admin_rank数值++,address更新成”我是_update_by_query”,name_alias_array字段,更新为一个集合。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
POST hotel_20190513/hotel/_update_by_query
{
"script": {
"inline": "ctx._source.admin_rank++;ctx._source['address']='我是_update_by_query';ctx._source['name_alias_array']=['哈哈','hei嘿']",
"lang": "painless"
},
"query": {
"bool": {"must": [
{"term": {
"id": {
"value": 9627361
}
}}
]}
}
}

删除entity_type = hotel_name的所有文档。

1
2
3
4
5
6
7
8
9
10
POST entity_hotel_20190528/entity_hotel/_delete_by_query
{
"query": {
"term": {
"entity_type": {
"value": "hotel_name"
}
}
}
}

golang例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
updateByQuery := client.UpdateByQuery().Query(elastic.NewTermQuery("entity_id", node.TagId)).Script(elastic.NewScriptInline(script)).Index(index).Type(indexType)
out, err := updateByQuery.Do(context.TODO())
if err != nil {
panic(err)
}
b, err := json.Marshal(out)
if err != nil {
panic(err)
}
got := string(b)
updated := tool.GoJson(got).Get("updated").ToString()
if tool.IsEmpty(updated) {
updated = "0"
}
println("执行成功.tagId=" + tool.ToString(node.TagId) + "更新" + updated + "个文档.")

参考文档

官方文档

评论