思路:先查询确认,后精准删除
假设我想删除title是”小明今晚真的不加班“这条记录,先查看一下现有的记录:
(不加班不好吗?为什么要删除呢?)
tips:可以使用match_phrase
精准查询,查询命令可以通过curl查询,也可以通过其他工具请求(其实道理都一样)
1 2 3 4 5 6 7 8 9
| curl -X POST "http://192.168.16.65:9211/blog/_search" -H 'Content-Type: application/json' -d' { "query": { "match_phrase": { "title": "小明今晚真的不加班" } } } '
|
blog
为索引,_search
为es的查询指令,查询结果如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| { "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
为”小明今晚真的不加班”的文档(忍痛):
1 2 3 4 5 6 7 8 9
| curl -X POST "http://127.0.0.1:9211/blog/_delete_by_query" -H 'Content-Type: application/json' -d' { "query":{ "match":{ "title":"小明今晚真的不加班" } } } '
|
tips: 使用_delete_by_query
时,必须指定索引,此处blog
就是索引,_delete_by_query
是elasticsearch的删除指令
删除结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| { "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自身是将该文档先标记准备删除状态,一段时间后,异步删除。