文章目录
- 1.根据 ID 删除
- 2.根据条件删除文档
- 3.批量删除
- 参考文献
本文借助第三方库 olivere/elastic 完成 Go 对 ES 的删除操作。
Go 对 Elasticsearch 的增删改查参见完整博文 Go Elasticsearch 增删改查(CRUD)快速入门。
1.根据 ID 删除
可以根据文档 ID 删除对应的文档。
代码语言:javascript复制// Delete 通过 ID 删除文档
func Delete(ctx context.Context, index, id string) error {
_, err := GetESClient().Delete().Index(index).Id(id).Refresh("true").Do(ctx)
return err
}
注意:重复删除会报**elastic: Error 404 (Not Found)
**错。
对应 RESTful API 为:
代码语言:javascript复制DELETE /es_index_userinfo/_doc/1?refresh=true
2.根据条件删除文档
我们也可以根据条件来删除符合条件的文档,即 Delete by Query,即使没有符合条件的文档,也不会报 404 错误。
代码语言:javascript复制// DeleteByQuery4ES 根据条件删除文档
// param: index 索引; query 条件
// ret: 删除的文档数; error
func DeleteByQuery4ES(ctx context.Context, index string, query elastic.Query) (int64, error) {
rsp, err := GetESClient().DeleteByQuery(index).Query(query).Refresh("true").Do(ctx)
if err != nil {
return 0, err
}
return rsp.Deleted, nil
}
注意:Refresh 只能指定 true 或 false(缺省值),不能指定 wait_for。
比如我们删除昵称为 cat 且年龄小于等于18 的用户。
代码语言:javascript复制query := elastic.NewBoolQuery()
query.Filter(elastic.NewTermQuery("nickname", "cat"))
query.Filter(elastic.NewRangeQuery("age").Lte(18))
ret, err := DeleteByQuery4ES(context.Background(), index, query)
对应的 RESTful API 为:
代码语言:javascript复制POST /es_index_userinfo/_delete_by_query?refresh=true
{
"query":{
"bool":{
"filter":[
{"term" : {"nickname" : "cat"}},
{"range" : {"age" : {"lte" : 18}}}
]
}
}
}
3.批量删除
借助 BulkService BulkDeleteRequest 可实现对文档的批量删除。
代码语言:javascript复制// DeleteBulk 删除文档批量(部分失败会返回失败)
// rets 删除的数量, error
func DeleteBulk(ctx context.Context, index string, ids []string) (int, error) {
bulkService := GetESClient().Bulk().Index(index).Refresh("true")
for i := range ids {
req := elastic.NewBulkDeleteRequest().Id(ids[i])
bulkService.Add(req)
}
res, err := bulkService.Do(ctx)
return len(res.Succeeded()), err
}
示例:
代码语言:javascript复制func main() {
ctx := context.Background()
// 全部成功
// 1 和 2 均存在
ids := []string{"1", "2"}
num, err := DeleteBulk(ctx, "es_index_userinfo", ids)
fmt.Printf("DeleteBulk all success, num=%v err=%vn", num, err)
// 部分成功
// 3 存在 33 不存在
ids = []string{"3", "33"}
num, err = DeleteBulk(ctx, "es_index_userinfo", ids)
fmt.Printf("DeleteBulk partial success, num=%v, err=%vn", num, err)
// 全部失败
// 44 和 55 均不存在
ids = []string{"44", "55"}
num, err = DeleteBulk(ctx, "es_index_userinfo", ids)
fmt.Printf("DeleteBulk all failed, num=%v err=%vn", num, err)
}
输出:
代码语言:javascript复制DeleteBulk all success, num=2 err=<nil>
DeleteBulk partial success, num=1, err=<nil>
DeleteBulk all failed, num=0 err=<nil>
对应的 Restful API:
代码语言:javascript复制POST es_index_userinfo/_bulk
{"delete":{"_id" : "1"}}
{"delete":{"_id" : "2"}}
{"delete":{"_id" : "3"}}
{"delete":{"_id" : "33"}}
{"delete":{"_id" : "44"}}
{"delete":{"_id" : "55"}}
参考文献
elastic - pkg.go.dev
elastic - type DeleteService
elastic - type DeleteByQueryService
elastic - type BulkService
elastic - BulkDeleteRequest