天天看點

Elasticsearch之delete_by_query和update_by_query

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

繼續閱讀