#背景
有时需要通过某些查询条件,更新文档某一个字段,这样的诉求,用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 + "个文档." )
参考文档 官方文档