Elasticsearch索引中数据的增删改查与并发控制

embedded/2024/10/18 18:28:22/

Elasticsearch提供了丰富的REST API接口,使得用户能够便捷地对索引映射中的数据进行增删改查操作。本文将通过示例演示这些操作方法,同时介绍如何利用乐观锁进行并发控制,以及如何实现索引数据的批量写入。

使用REST端点对索引映射中的数据进行增删改查

首先,创建一个名为person的索引,并定义其映射结构:

PUT person
{"mappings": {"properties": {"id": {"type": "integer"},"sex": {"type": "boolean"},"name": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}},"born": {"type": "date","format": "yyyy-MM-dd HH:mm:ss"},"location": {"type": "geo_point"}}}
}

接下来,执行以下操作:

写入一条数据

POST person/_doc/1
{"id": "1","sex": true,"name": "张三","born": "2020-09-18 00:02:20","location": {"lat": 41.12,"lon": -71.34}
}

查询第一条数据

GET person/_doc/1

修改数据

POST person/_update/1
{"doc": {"sex": false,"born": "2020-02-24 00:02:20"}
}

删除数据

DELETE person/_doc/1

插入数据(覆盖原有文档)

POST person/_doc/1
{"id": "1","sex": true,"name": "张三","born": "2020-09-18 00:02:20","location": {"lat": 41.12,"lon": -71.34}
}

查询结果如下:

{"_index" : "person","_type" : "_doc","_id" : "1","_version" : 4,"_seq_no" : 9,"_primary_term" : 1,"found" : true,"_source" : {"id" : "1","sex" : false,"name" : "张三","born" : "2020-09-11 00:02:20","location" : {"lat" : 41.12,"lon" : -71.34}}
}

使用乐观锁进行并发控制

在高并发环境下,可能会有多个请求同时尝试修改同一份数据。为了保证数据一致性,可以利用Elasticsearch提供的乐观锁机制进行并发控制。在更新数据时,传递if_seq_noif_primary_term参数,确保只有当当前版本与预期版本一致时才执行更新:

PUT person/_doc/1?if_seq_no=9&if_primary_term=1
{"id": "1","sex": false,"name": "张三","born": "2020-09-11 00:02:20","location": {"lat": 41.12,"lon": -71.34}
}

索引数据的批量写入

Elasticsearch支持一次请求内执行多条数据的增删改操作,极大地提高了数据写入效率。批量写入的操作类型包括indexcreateupdatedelete

批量添加或更新数据

POST person/_bulk
{"index":{"_id":"3"}}
{"id":"3","name":"王五","sex":true,"born":"2020-09-14 00:02:20","location":{"lat":11.12,"lon":-71.34}}
{"index":{"_id":"4"}}
{"id":"4","name":"李四","sex":false,"born":"2020-10-14 00:02:20", "location":{"lat":11.12,"lon":-71.34}}
{"index":{"_id":"5"}}
{"id":"5","name":"黄六","sex":false,"born":"2020-11-14 00:02:20", "location":{"lat":11.12,"lon":-71.34}}

混合操作示例

POST person/_bulk
{"index":{"_id":"2"}}
{"id":"2","name":"赵二","sex":true,"born":"2020-09-14 00:02:20","location":{"lat":11.12,"lon":-71.34}}
{"create":{"_id":"4"}}
{"id":"4","name":"李四","sex":false,"born":"2020-10-14 00:02:20", "location":{"lat":11.12,"lon":-71.34}}
{"update":{"_id":"5"}}
{ "doc" : {"sex" : "false","born" : "2020-01-01 00:02:20"} }
{"delete":{"_id":"5"}}

索引重建。

首先,创建一个新的索引newperson,并设置其分片数和副本数:

PUT newperson
{"settings": {"number_of_shards": "5","number_of_replicas": "1"}
}

接下来,使用_reindex API将原索引person中的所有数据迁移到新索引newperson

POST _reindex
{"source": {"index": "person"},"dest": {"index": "newperson"}
}

以上操作将按照原索引person的映射结构和数据顺序,将所有文档复制到新索引newperson中。完成迁移后,新索引将拥有与原索引相同的文档集合,但可以根据需要拥有不同的配置、映射或元数据。

值得注意的是,_reindex操作可能消耗大量系统资源,尤其是当源索引数据量较大时。因此,在执行此操作前应确保集群有足够的资源,并尽量选择低峰时段进行。此外,如果源索引在重建期间有新的数据写入,这些数据不会被包含在重建后的索引中。因此,可能需要暂停相关应用程序的写入操作,或者在重建完成后重新同步新增数据。

总结来说,Elasticsearch提供了丰富的REST API接口,使得用户能够方便地对索引中的数据进行增删改查操作。通过使用乐观锁机制,可以有效防止并发冲突,保障数据一致性。此外,批量写入功能极大地提升了数据写入的效率,适用于大规模数据导入或频繁更新的场景。


http://www.ppmy.cn/embedded/16941.html

相关文章

Maven实战—搭建微服务 Maven 工程架构

需求案例:搭建一个电商平台项目,该平台包括用户服务、订单服务、通用工具模块等。 项目架构: 用户服务:负责处理用户相关的逻辑,例如用户信息的管理、用户注册、登录等。订单服务:负责处理订单相关的逻辑…

华为P系列“砍了”,三角美学系列全新登场

2021 年 10 月,Intel 正式带来了颠覆以往的第 12 代酷睿「混合架构」 CPU。 不知道是良心发现还是为了弥补 11 代酷睿过于拉胯表现,Intel 终于把狠活儿都用在了这代。 全新 Intel 7 工艺、全新架构、单核与多核性能大幅提升,让大家十分默契…

Android Studio实现内容丰富的安卓养老平台

获取源码请点击文章末尾QQ名片联系,源码不免费,尊重创作,尊重劳动 158安卓养老 1.开发环境 后端用springboot框架,安卓的用android studio开发android stuido3.6 jak1.8 idea mysql tomcat 2.功能介绍 安卓端: 1.注册登…

React 之 函数式组件(二)

React的函数式组件是React组件的一种形式,它使用JavaScript函数而不是类来定义组件。这种组件形式在React 16.8版本引入Hooks之后变得特别流行,因为它使得组件逻辑更加简洁、易于理解和测试。 import React from react; function Welcome(props) { //…

HttpURLConnection 接收长字符串时出现中文乱码出现问号��

HttpURLConnection 接收长字符串的时候随机位置出现中文乱码,显示问号,究其原因是utf8解码长度问题,程序上写法需要注意,要把字节全部读进来一起转码,不能边读取边转码,会截断中文的字节码,导致…

水仙花数-第12届蓝桥杯省赛Python真题精选

[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第56讲。 水仙花数&#xf…

【人工智能基础】机器学习

一、机器学习概念 机器学习是从示例中学习的方法。我们不需要编写分类的规则,而是通过提供大量的相关数据来训练它们 机器学习分类 有监督学习 假设有可用的训练数据,每个样本都有类别标注,分类器是通过利用这些先验已知信息而设计的 无…

2024/4/22(分布式服务事务,CAP,BASE理论,Seata,微服务集成Seata,XA,AT,TCC.Saga,TC高可用,异地容灾)

配置内容如下:properties # 数据存储方式,db代表数据库 store.modedb store.db.datasourcedruid store.db.dbTypemysql store.db.driverClassNamecom.mysql.jdbc.Driver store.db.urljdbc:mysql://127.0.0.1:3306/seata?useUnicodetrue&rewriteBatc…