文章目录

  • 1.根据 ID 删除
  • 2.根据条件删除
  • 3.批量删除
  • 4.FAQ
    • 4.1 elastic: Error 409 (Conflict)
  • 参考文献

本文借助第三方库 olivere/elastic 完成 Go 对 ES 的删除操作。

Go 对 Elasticsearch 的增删改查参见完整博文 Go Elasticsearch 增删改查(CRUD)快速入门。

1.根据 ID 删除

可以根据文档 ID 删除对应的文档。

// 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 为:

DELETE /es_index_userinfo/_doc/1?refresh=true

2.根据条件删除

我们也可以根据条件来删除符合条件的文档,即 Delete by Query。即使没有符合条件的文档,也不会报 404 错误。

// DeleteByQuery4ES 根据条件删除文档。
// param: index 索引; query 条件。
// return: 删除的文档数; 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 的用户。

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 为:

POST /es_index_userinfo/_delete_by_query?refresh=true
{"query":{"bool":{"filter":[{"term" : {"nickname" : "cat"}},{"range" : {"age" : {"lte" : 18}}}]}}
}

3.批量删除

借助 BulkService + BulkDeleteRequest 可实现对文档的批量删除。

注意: 指定的文档不存在不会报错,会返回实际删除的文档数。

// 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
}

示例:

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)
}

输出:

DeleteBulk all success, num=2 err=<nil>
DeleteBulk partial success, num=1, err=<nil>
DeleteBulk all failed, num=0 err=<nil>

对应的 Restful API:

POST es_index_userinfo/_bulk
{"delete":{"_id" : "1"}}
{"delete":{"_id" : "2"}}
{"delete":{"_id" : "3"}}
{"delete":{"_id" : "33"}}
{"delete":{"_id" : "44"}}
{"delete":{"_id" : "55"}}

4.FAQ

4.1 elastic: Error 409 (Conflict)

Elasticsearch 会在删除文档前使用查询时获取的 internal 版本号和当前文档版本号进行对比。如果在查询和删除操作之间文档发生更改,则会导致版本冲突并且删除操作失败,报 elastic: Error 409 (Conflict) 错误。

解决版本冲突一般有三个方法:

  • 重试。

重试不保证一定会删除成功,一般情况下在重试时冲突的概率会小很多。

  • 跳过冲突的文档并继续执行删除。

我们可以选择在发生冲突时是继续执行剩余的文档删除操作(proceed),还是终止返回(abort),缺省是 abort

如删除索引 my-index-000001 中所有文档,跳过发生冲突的文档。

POST my-index-000001/_delete_by_query?conflicts=proceed
{"query": {"match_all": {}}
}
  • 根据ID批量删除(强制删除)。

我们可以分两步走,一步是查询符合条件的文档,一步是根据文档 ID 进行批量删除。这相当于忽略查询与删除操作间的变更,进行强制删除。

查询操作参见 Go Elasticsearch 查询快速入门。


参考文献

elastic - pkg.go.dev
elastic - type DeleteService
elastic - type DeleteByQueryService
elastic - type BulkService
elastic - BulkDeleteRequest
Elasticsearch Guide [8.1] » REST APIs » Document APIs » Delete by query API

Go Elasticsearch 删除快速入门相关推荐

  1. Elasticsearch【快速入门】

    前言:毕设项目还要求加了这个做大数据搜索,正好自己也比较感兴趣,就一起来学习学习吧! Elasticsearch 简介 Elasticsearch 是一个分布式.RESTful 风格的搜索和数据分析引 ...

  2. Go Elasticsearch 更新快速入门

    文章目录 1.根据 ID 修改 2.根据 ID 修改(不存在则插入) 3.根据条件更新 4.批量更新 5.脚本更新 5.1 删除数组中的某个元素 5.2 删除数组中的多个元素 参考文献 本文借助第三方 ...

  3. Go Elasticsearch 增加快速入门

    文章目录 1.创建单个文档 1.1 Go 1.2 RESTful API 2.批量创建文档 2.1 Go 2.1 RESTful API 参考文献 创建完 ES 的 index,便可以向 index ...

  4. Go Elasticsearch 查询快速入门

    文章目录 0.前言 1.根据 ID 查询 2.精确匹配单个字段 3.精确匹配单个字段的多个值 4.全文查询 5.范围查询 6.判断某个字段是否存在 7.bool 组合查询 must filter sh ...

  5. Go Elasticsearch 快速入门

    文章目录 1.入门简介 2.基本概念 3.客户端库 4.创建客户端 5.index 增删改查 6.增加 7.删除 8.修改 9.查询 10.小结 参考文献 1.入门简介 Elasticsearch 简 ...

  6. 【Elastic Stack上】Elastic Search快速入门,让你对ELK日志架构不再困惑

    课程介绍 Elastic Stack简介 Elasticsearch的介绍与安装 Elasticsearch的快速入门 Elasticsearch的核心讲解中文分词 全文搜索 Elasticsearc ...

  7. 尚硅谷-SpringBoot高级-检索-Elasticsearch快速入门

    前面我们安装好了ElasticSearch,我以后就简称他为ES,而一些人还不知道基本的使用,那我们接下来做一个快速入门,了解一下他的使用方法,以及一些基本概念,方便我们后来整合,那么要学习ES最好的 ...

  8. elasticsearch 删除满足条件的语句_ELK从入门到还未精通(二)——ElasticSearch上篇

    大家好,我是泥腿子安尼特,5个月没在李佬都公众号更新文章了.上一篇,大致介绍了作为工具人的我是如何基本使用这一套ELK 系统的.今天就讲讲这个最重要的E--基于Lucene的搜索引擎ElasticSe ...

  9. ElasticSearch快速入门

    官网地址(https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html)而且是中文的 Elastic的快速入门 1.基础 ...

最新文章

  1. pandas使用groupby函数对dataframe进行分组统计、使用as_index参数设置分组聚合的结果中分组变量不是dataframe的索引(index)
  2. android ------- TCP/IP
  3. Microwindows及基于Nano-X的简单程序开发
  4. 定义[nextTick、事件循环]
  5. php怎么更新多条数据,PHP中批量更新数据表中多条记录
  6. makefile——小试牛刀
  7. 【LeetCode笔记】1. 两数之和(JAVA、哈希表)
  8. 搜狐视频怎么更改头像
  9. 在Eclispe中编译运行jbox2d
  10. 系统时钟(汇编语言程序设计)
  11. MediaInfo源代码分析 4:Inform()函数
  12. 使用DataSet Datatable 更新数据库的三种方式及DataTable不同状态的取值
  13. vue中 点击事件的写法_Vue父子组件状态同步的最佳方式
  14. 2022新版起点云码支付 带云端支持云端授权域名代理
  15. 深度学习优化算法-AdaDelta算法
  16. 威佐夫博弈(C语言)
  17. 向量空间的基和维数例题_向量空间基和维数的等价定义及求法
  18. 服务器地址为空,dns服务器地址为空
  19. JDBC MySQL 连接
  20. 全球及中国3,4-二氯异噻唑-5-羧酸行业研究及十四五规划分析报告

热门文章

  1. Bug 险中求: 作为新手,我怎样才能快速找到不和别人重复的第一个 bug?
  2. 2017-2018-1 20155229 实验五 《通讯协议设计》
  3. linux的增删改查、压缩与解压缩
  4. transform()
  5. 大学生魏则西之死,谁该为违法广告买单?
  6. 用memoization优化递归算法[JS/PHP实现]
  7. 查看是否存在DDOS*** netstat
  8. Java: Queue
  9. Ubuntu中SVN的安装和使用
  10. Step by Step-构建自己的ORM系列-索引