Update By Query API
最简单的用法是_update_by_query在不更改源的情况下对索引中的每个文档执行更新。这对于获取新属性或其他一些在线映射更改很有用 。这是API:
POST twitter/_update_by_query?conflicts=proceed
_update_by_query在索引启动时获取索引的快照,并使用internal版本控制索引它。这意味着如果文档在拍摄快照的时间和处理索引请求之间发生更改,则会出现版本冲突。当版本匹配时,文档会更新,版本号会递增。
注:由于internal版本控制不支持将值0作为有效版本号,因此无法使用版本等于零的文档进行更新, _update_by_query并且将使请求失败。
所有更新和查询失败都会导致_update_by_query中止并failures在响应中返回。已执行的更新仍然存在。换句话说,该过程不会回滚,只会中止。当第一个失败导致中止时,失败的批量请求返回的所有失败都将在failures元素中返回; 因此,可能存在相当多的失败实体。
如果您只想计算版本冲突,不要导致_update_by_query 中止,您可以conflicts=proceed在URL或"conflicts": "proceed" 请求正文中设置。
_update_by_query 支持脚本来更新文档。
就像在Update API中一样,您可以设置ctx.op更改执行的操作:
- noop
设置ctx.op = "noop"脚本是否确定不需要进行任何更改。这将导致_update_by_query从其更新中省略该文档。这种无操作将noop在响应机构的计数器中 报告。
- delete
设置ctx.op = "delete"如果你的脚本决定,该文件必须被删除。删除将deleted在响应正文中的计数器中 报告。
设置ctx.op为其他任何内容都是错误的。设置任何其他字段ctx是错误的。
PUT gaoyh
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
}
}
GET gaoyh/test/_search
PUT gaoyh/test/3
{
"counter":1,
"tags":["red"]
}
按照tags标签进行查找,就算只查找,没有进行脚本操作,version一样会增加,result:updated;
根据查找条件,进行脚本操作,则所有匹配到的文档全部更新,批量更新,result:updated
POST gaoyh/_update_by_query
{
"query":{
"match":{
"tags":"red"
}
},
"script":{
"source":"ctx._source.tags.add(params.tag)",
"lang":"painless",
"params":{
"tag":"white"
}
}
}
PUT gaoyh
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
},
"mappings": {
"test":{
"dynamic":false,
"properties": {
"content":{
"type": "text"
}
}
}
}
}
禁止mapping动态映射
POST gaoyh/test?refresh
{
"content":"text",
"flag":"bar"
}
意味着新字段不会编入索引,只存储在_source中
PUT gaoyh/_mapping/test
{
"properties": {
"flag":{
"type":"text",
"analyzer": "keyword"
}
}
}
更新映射,添加新flag字段,但是要获取新字段必须使用它重新索引所有文档
未重新索引:
POST gaoyh/_search?filter_path=hits.total
{
"query": {
"match": {
"flag": "bar"
}
}
}
响应结果:
{
"hits" : {
"total" : 0
}
}
重新索引:
发出update_by_query请求获取新映射:
POST test/_update_by_query?refresh&conflicts=proceed
POST test/_search?filter_path=hits.total
{
"query": {
"match": {
"flag": "bar"
}
}
}
响应结果:
{
"hits" : {
"total" : 1
}
}