「Elasticsearch」查询并删除匹配文档之_delete_by_query
「Elasticsearch」查询并删除匹配文档之_delete_by_query
小明 Lv6

思路:先查询确认,后精准删除

假设我想删除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自身是将该文档先标记准备删除状态,一段时间后,异步删除。

 评论