思路:先查詢確認,后精准刪除
假設我想刪除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自身是將該文檔先標記准備刪除狀態,一段時間后,異步刪除。