Go Elasticsearch 删除快速入门
文章目录
- 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 删除快速入门相关推荐
- Elasticsearch【快速入门】
前言:毕设项目还要求加了这个做大数据搜索,正好自己也比较感兴趣,就一起来学习学习吧! Elasticsearch 简介 Elasticsearch 是一个分布式.RESTful 风格的搜索和数据分析引 ...
- Go Elasticsearch 更新快速入门
文章目录 1.根据 ID 修改 2.根据 ID 修改(不存在则插入) 3.根据条件更新 4.批量更新 5.脚本更新 5.1 删除数组中的某个元素 5.2 删除数组中的多个元素 参考文献 本文借助第三方 ...
- Go Elasticsearch 增加快速入门
文章目录 1.创建单个文档 1.1 Go 1.2 RESTful API 2.批量创建文档 2.1 Go 2.1 RESTful API 参考文献 创建完 ES 的 index,便可以向 index ...
- Go Elasticsearch 查询快速入门
文章目录 0.前言 1.根据 ID 查询 2.精确匹配单个字段 3.精确匹配单个字段的多个值 4.全文查询 5.范围查询 6.判断某个字段是否存在 7.bool 组合查询 must filter sh ...
- Go Elasticsearch 快速入门
文章目录 1.入门简介 2.基本概念 3.客户端库 4.创建客户端 5.index 增删改查 6.增加 7.删除 8.修改 9.查询 10.小结 参考文献 1.入门简介 Elasticsearch 简 ...
- 【Elastic Stack上】Elastic Search快速入门,让你对ELK日志架构不再困惑
课程介绍 Elastic Stack简介 Elasticsearch的介绍与安装 Elasticsearch的快速入门 Elasticsearch的核心讲解中文分词 全文搜索 Elasticsearc ...
- 尚硅谷-SpringBoot高级-检索-Elasticsearch快速入门
前面我们安装好了ElasticSearch,我以后就简称他为ES,而一些人还不知道基本的使用,那我们接下来做一个快速入门,了解一下他的使用方法,以及一些基本概念,方便我们后来整合,那么要学习ES最好的 ...
- elasticsearch 删除满足条件的语句_ELK从入门到还未精通(二)——ElasticSearch上篇
大家好,我是泥腿子安尼特,5个月没在李佬都公众号更新文章了.上一篇,大致介绍了作为工具人的我是如何基本使用这一套ELK 系统的.今天就讲讲这个最重要的E--基于Lucene的搜索引擎ElasticSe ...
- ElasticSearch快速入门
官网地址(https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html)而且是中文的 Elastic的快速入门 1.基础 ...
最新文章
- pandas使用groupby函数对dataframe进行分组统计、使用as_index参数设置分组聚合的结果中分组变量不是dataframe的索引(index)
- android ------- TCP/IP
- Microwindows及基于Nano-X的简单程序开发
- 定义[nextTick、事件循环]
- php怎么更新多条数据,PHP中批量更新数据表中多条记录
- makefile——小试牛刀
- 【LeetCode笔记】1. 两数之和(JAVA、哈希表)
- 搜狐视频怎么更改头像
- 在Eclispe中编译运行jbox2d
- 系统时钟(汇编语言程序设计)
- MediaInfo源代码分析 4:Inform()函数
- 使用DataSet Datatable 更新数据库的三种方式及DataTable不同状态的取值
- vue中 点击事件的写法_Vue父子组件状态同步的最佳方式
- 2022新版起点云码支付 带云端支持云端授权域名代理
- 深度学习优化算法-AdaDelta算法
- 威佐夫博弈(C语言)
- 向量空间的基和维数例题_向量空间基和维数的等价定义及求法
- 服务器地址为空,dns服务器地址为空
- JDBC MySQL 连接
- 全球及中国3,4-二氯异噻唑-5-羧酸行业研究及十四五规划分析报告