【Elasticsearch】查詢並刪除匹配文檔之_delete_by_query


思路:先查詢確認,后精准刪除

假設我想刪除title是”小明今晚真的不加班“這條記錄,先查看一下現有的記錄:

(不加班不好嗎?為什么要刪除呢?)

tips:可以使用match_phrase精准查詢,查詢命令可以通過curl查詢,也可以通過其他工具請求(其實道理都一樣)

curl -X POST "http://192.168.16.65:9211/blog/_search" -H 'Content-Type: application/json' -d'
{
    "query": {
        "match_phrase": {
            "title": "小明今晚真的不加班"
        }
    }
}
'

blog為索引,_search為es的查詢指令,查詢結果如下:

{
	"took": 13,
	"timed_out": false,
	"_shards": {
		"total": 3,
		"successful": 3,
		"skipped": 0,
		"failed": 0
	},
	"hits": {
		"total": {
			"value": 1,
			"relation": "eq"
		},
		"max_score": 110.28655,
		"hits": [{
			"_index": "blog",
			"_type": "_doc",
			"_id": "6a0d343fb629da2e2cdf6f4bf250af04",
			"_score": 110.28655,
			"_source": {
				"author": "程序員小明",
				"capture_time": 1583820020000,
				"content": "今晚可以終於可以王者榮耀帶妹了",
				"title": "小明今晚真的不加班",
				"top_domain": "mynamecoder.com",
				"url": "http://blog.mynamecoder.com"
			}
		}]
	}
}

可以看到數據中有一條符合條件的文檔,我們現在就要刪除該文檔。

刪除title為"小明今晚真的不加班"的文檔(忍痛):

curl -X POST "http://192.168.16.65:9211/blog/_delete_by_query" -H 'Content-Type: application/json' -d'
{
  "query":{
    "match":{
      "title":"小明今晚真的不加班"
    }
  }
}
'

tips: 使用_delete_by_query時,必須指定索引,此處blog就是索引,_delete_by_query是elasticsearch的刪除指令

刪除結果:

{
  "took" : 147,
  "timed_out": false,
  "deleted": 1,
  "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" : [ ]
}

重點關注total(查詢到的條數)和deleted(刪除的總數)兩個字段,最后不放心的話,可以再查詢一下剛才那個文檔是否還存在。

tips:es執行刪除的時候es並不是立即刪除,雖然我們再次查詢已經找不到了,但es自身是將該文檔先標記准備刪除狀態,一段時間后,異步刪除。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM