一日一技:Elasticsearch批量插入时,存在就不插入

简介: 一日一技:Elasticsearch批量插入时,存在就不插入

摄影:产品经理买单:kingname

当我们使用 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语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。  
目录
相关文章
|
12月前
|
存储 人工智能 Java
AI 超级智能体全栈项目阶段三:自定义 Advisor 与结构化输出实现以及对话记忆持久化开发
本文介绍如何在Spring AI中自定义Advisor实现日志记录、结构化输出、对话记忆持久化及多模态开发,结合阿里云灵积模型Qwen-Plus,提升AI应用的可维护性与功能性。
2081 125
AI 超级智能体全栈项目阶段三:自定义 Advisor 与结构化输出实现以及对话记忆持久化开发
|
安全 Java Linux
Linux下Kibana的安装、配置及开机自启动
Linux下安装配置Kibana 项目基本环境: OS:CentOs7 JDK:1.8 Kibana:7.6.2
5951 1
Linux下Kibana的安装、配置及开机自启动
|
10月前
|
存储 人工智能 Cloud Native
【2025云栖大会】AI原生搜索引擎:Elasticsearch 换“芯”
9月26日,云栖大会AI搜索与向量引擎分论坛上,阿里云智能集团技术专家 魏子珺 和爱橙科技技术专家 周文喆,详细阐释了 “AI 原生搜索引擎:Elasticsearch 换芯” 技术主题,重点围绕 AI 原生搜索内核增强技术的升级与替换。通过核心能力重构,让 Elasticsearch 在 AI 原生时代具备更强的多模态理解、自然语言处理以及深度任务执行能力,为搜索场景带来性能、智能化与可扩展性的大幅提升。
858 0
|
Java 关系型数据库 MySQL
SpringBoot手动提交事务
SpringBoot手动提交事务
1872 0
|
数据采集 存储 调度
BeautifulSoup VS Scrapy:如何选择适合的HTML解析工具?
在Python网页抓取领域,BeautifulSoup和Scrapy是两款备受推崇的工具。BeautifulSoup易于上手、灵活性高,适合初学者和简单任务;Scrapy则是一个高效的爬虫框架,内置请求调度、数据存储等功能,适合大规模数据抓取和复杂逻辑处理。两者结合使用可以发挥各自优势,例如用Scrapy进行请求调度,用BeautifulSoup解析HTML。示例代码展示了如何在Scrapy中设置代理IP、User-Agent和Cookies,并使用BeautifulSoup解析响应内容。选择工具应根据项目需求,简单任务选BeautifulSoup,复杂任务选Scrapy。
585 1
BeautifulSoup VS Scrapy:如何选择适合的HTML解析工具?
|
消息中间件 Java 关系型数据库
【二十】springboot整合ElasticSearch实战(万字篇)
【二十】springboot整合ElasticSearch实战(万字篇)
4130 47
|
存储 分布式计算 网络协议
【Elasticsearch】elasticsearch.yml配置文件解读,ES配置详解
【Elasticsearch】elasticsearch.yml配置文件解读,ES配置详解
2458 0
|
人工智能 测试技术 API
Ollama本地模型部署+API接口调试超详细指南
本文介绍了如何使用Ollama工具下载并部署AI大模型(如DeepSeek-R1、Llama 3.2等)。首先,访问Ollama的官方GitHub页面下载适合系统的版本并安装。接着,在终端输入`ollama`命令验证安装是否成功。然后,通过命令如`ollama run Llama3.2`下载所需的AI模型。下载完成后,可以在控制台与AI模型进行对话,或通过快捷键`control+d`结束会话。为了更方便地与AI互动,可以安装GUI或Web界面。此外,Ollama还提供了API接口,默认支持API调用,用户可以通过Apifox等工具调试这些API。
|
存储 消息中间件 JSON
DDD基础教程:一文带你读懂DDD分层架构
DDD基础教程:一文带你读懂DDD分层架构
|
easyexcel Java 关系型数据库
阿里巴巴-EasyExcel 基于Java的简单、省内存的读写Excel
该文章主要介绍了在Java应用中如何使用EasyExcel技术完成对Excel文件的导入和导出操作,包括环境搭建、基本概念、快速入门、进阶操作和综合应用等内容,并提供了相关代码示例和注意事项。
 阿里巴巴-EasyExcel 基于Java的简单、省内存的读写Excel