Elasticsearch批量插入时,存在就不插入
当我们使用 Elasticsearch-py 批量插入数据到 ES 的时候,我们常常使用它的 helpers
模块里面的bulk
函数。其使用方法如下:
from elasticsearch import helpers, Elasticsearch es = Elasticsearch(xxx) def generator(): datas = [1, 2, 3] for data in datas: yield { '_id': "xxx", '_source': { 'age': data } } helpers.bulk(es, index='xxx', generator(), doc_type='doc',)
但这种方式有一个问题,它默认相当于upsert
操作。如果_id
对应的文档已经在 ES 里面了,那么数据会被更新。如果_id
对应的文档不在 ES 中,那么就插入。
如果我想实现,不存在就插入,存在就跳过怎么办?此时就需要在文档里面添加_op_type
指定操作类型为create
:
from elasticsearch import helpers, Elasticsearch es = Elasticsearch(xxx) def generator(): datas = [1, 2, 3] for data in datas: yield { '_op_type': 'create', '_id': "xxx", '_source': { 'age': data } } helpers.bulk(es, generator(), index='xxx', doc_type='doc')
此时,如果_id
对应的文档不在 ES 中,那么就会正常插入,如果ES
里面已经有_id
对应的数据了,那么就会报错。由于bulk
一次性默认插入500条数据,假设其中有2条数据已经存在了,那么剩下的498条会被正常插入。然后程序报错退出,告诉你有两条写入失败,因为已经存在。
如果你不想让程序报错终止,那么可以增加2个参数:
helpers.bulk(es, generator(), index='xxx', doc_type='doc', raise_on_exception=False, raise_on_error=False)
其中raise_on_exception=False
表示在插入数据失败时,不需要抛出异常。raise_on_error=False
表示不抛出BulkIndexError
。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
2019-01-16 form组件之modelForm
2019-01-16 关于form组件的补充-------formChoice
2019-01-16 stark组件之创建