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一樣,不再贅述,另外也提供異步任務模式。