delete_by_query
delete_by_query方法会删除符合条件的记录,示例如下:
POST twitter/(doc_type, 5.x)/_delete_by_query
{
"query": {
"match": {
"message": "some message"
}
}
}
查询语句跟search api是一样的,很方便。
然后就会得到类似下面的结果:
{
"took" : 147,
"timed_out": false,
"deleted": 119,
"batches": 1,
"version_conflicts": 0,
"noops": 0,
"retries": {
"bulk": 0,
"search": 0
},
"throttled_millis": 0,
"requests_per_second": -1.0,
"throttled_until_millis": 0,
"total": 119,
"failures" : [ ]
}
- version_conflicts表示是否有数据版本冲突,因为开始要删除时,delete_by_query会得到索引快照并且使用内部版本号来找到要删除哪些文档。如果获取到快照与执行删除过程的这段时间内,有文档发生变化,那么版本就会冲突。另外版本冲突后可以设置conflicts=proceed跳过冲突。
- retries表示重试次数,因为本操作是按批次处理的,当一个批次操作时可能会失败,这时候es会发起重试。
- requests_per_second表示在通过查询删除期间有效执行的每秒请求数。
- throttled_millis表示请求睡眠以符合requests_per_second的毫秒数。
- throttled_until_millis:在delete_by_query响应中,此字段应始终等于零。 它只在使用Task API时有意义,它指示再次执行限制请求以符合requests_per_second。
任务模式
在delete_by_query中如果加上参数wait_for_completion=false就会开启任务模式,响应会直接返回一个task id,不用等待操作执行完毕。
可以通过api:
GET _tasks?detailed=true&actions=*/delete/byquery
查看正在执行的异步任务,
也可以直接通过
GET /_tasks/{task id}
直接查看异步任务的信息。
如果需要取消这个异步任务,则需要请求
POST _tasks/{task id}/_cancel
。
update_by_query
update_by_query的语法基本上和delete_by_query类似,但是因为增加了更新操作,所以语句内会增加相应的更新语句。
例如:
POST twitter/_update_by_query
{
"script" : {
"source": "ctx._source.counter += params.count",
"lang": "painless",
"params" : {
"count" : 4
}
},
"query": {
"term": {
"user": "kimchy"
}
}
}
或者:
POST twitter/_update_by_query
{
"script": {
"source": "ctx._source.likes++",
"lang": "painless"
},
"query": {
"term": {
"user": "kimchy"
}
}
}
其他语法和delete_by_query一样,不再赘述,另外也提供异步任务模式。