前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go Elasticsearch 删除快速入门

Go Elasticsearch 删除快速入门

作者头像
恋喵大鲤鱼
发布2021-12-06 10:50:32
1.6K0
发布2021-12-06 10:50:32
举报
文章被收录于专栏:C/C++基础

文章目录

本文借助第三方库 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=%v\n", num, err)

	// 部分成功
	// 3 存在 33 不存在
	ids = []string{"3", "33"}
	num, err = DeleteBulk(ctx, "es_index_userinfo", ids)
	fmt.Printf("DeleteBulk partial success, num=%v, err=%v\n", num, err)

	// 全部失败
	// 44 和 55 均不存在
	ids = []string{"44", "55"}
	num, err = DeleteBulk(ctx, "es_index_userinfo", ids)
	fmt.Printf("DeleteBulk all failed, num=%v err=%v\n", 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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/11/18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 1.根据 ID 删除
  • 2.根据条件删除文档
  • 3.批量删除
  • 参考文献
相关产品与服务
Elasticsearch Service
腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档