浅谈Elasticsearch 文档操作

Elasticsearch 文档操作

Elasticsearch 是一个基于 Lucene 的分布式搜索引擎,它提供了全文搜索、结构化搜索、分析等功能。在 Elasticsearch 中,文档操作是一个重要的功能,包括文档的索引、更新、删除以及批量操作。本文将详细介绍 Elasticsearch 中的文档操作。

1. 文档索引

1.1 索引文档基本概念

在 Elasticsearch 中,数据以文档(Document)的形式存储。文档是一个 JSON 对象,包含了一组字段(Field)和对应的值。文档可以被索引到一个索引(Index)中,类似于关系型数据库中的表(Table)。每个文档都有一个唯一的 ID,用于标识和检索文档。

1.2 索引文档

在 Elasticsearch 中,我们可以使用 PUTPOST 请求来索引文档。例如,我们有一个名为 users 的索引,我们可以向其中添加一个用户文档:

PUT /users/_doc/1
{"name": "Alice","age": 30,"email": "alice@example.com"
}

在这个例子中,我们使用了 PUT 请求来索引一个用户文档。这里我们指定了文档的 ID 为 1。如果文档 ID 已经存在,那么新的文档将覆盖旧的文档。

我们还可以使用 POST 请求来自动生成文档 ID:

POST /users/_doc
{"name": "Bob","age": 25,"email": "bob@example.com"
}

在这个例子中,我们使用了 POST 请求来索引一个用户文档。这里我们没有指定文档的 ID,Elasticsearch 会自动生成一个唯一的文档 ID。

1.3 索引设置和映射

在索引文档之前,我们通常需要创建索引并定义其设置(Settings)和映射(Mappings)。索引设置包括分片数量、副本数量等参数,用于控制索引的性能和可用性。映射定义了文档中字段的类型、分析器等属性,用于控制字段的索引和搜索行为。

例如,我们可以创建一个名为 users 的索引,并定义其设置和映射:

PUT /users
{"settings": {"number_of_shards": 1,"number_of_replicas": 1},"mappings": {"properties": {"name": {"type": "text"},"age": {"type": "integer"},"email": {"type": "keyword"}}}
}

在这个例子中,我们创建了一个名为 users 的索引,并定义了其设置和映射。这里我们设置了分片数量为 1,副本数量为 1。同时,我们定义了三个字段:name(文本类型)、age(整数类型)和 email(关键词类型)。

1.4 文档版本控制

在 Elasticsearch 中,每个文档都有一个版本号(Version),用于控制文档的并发更新。当我们索引、更新或删除文档时,文档的版本号会自动递增。我们可以使用版本号来实现乐观锁,确保文档在并发更新时不会发生冲突。

例如,我们可以使用 PUT 请求来索引一个用户文档,并指定其版本号:

PUT /users/_doc/1?version=2&version_type=external
{"name": "Alice","age": 31,"email": "alice@example.com"
}

在这个例子中,我们使用了 version 参数来指定文档的版本号,以及 version_type 参数来指定版本类型。这里我们将版本号设置为 2,版本类型设置为 external。当我们尝试索引文档时,Elasticsearch 会检查文档的当前版本号。如果当前版本号小于指定的版本号,那么操作会成功;否则,操作会失败并返回版本冲突错误。

需要注意的是,版本控制可以帮助我们避免并发更新导致的数据不一致问题,但可能会增加系统的复杂性。在实际应用中,我们需要根据需求和场景来选择是否使用版本控制。

1.5 自动创建索引

在 Elasticsearch 中,如果我们尝试索引一个文档到一个不存在的索引,Elasticsearch 会自动创建该索引。自动创建的索引会使用默认的设置和映射,可能不符合我们的需求。因此,我们通常需要在索引文档之前创建索引并定义其设置和映射。

如果需要,我们可以禁用自动创建索引功能。例如,我们可以将 action.auto_create_index 设置为 false

PUT /_cluster/settings
{"persistent": {"action.auto_create_index": "false"}
}

在这个例子中,我们使用了 _cluster/settings API 来修改集群设置。这里我们将 action.auto_create_index 设置为 false,表示禁用自动创建索引功能。需要注意的是,禁用自动创建索引功能后,我们必须手动创建索引并定义其设置和映射。

2. 文档更新

2.1 更新文档基本概念

在 Elasticsearch 中,文档更新实际上是一个删除和索引操作的组合。当我们更新一个文档时,Elasticsearch 会将旧的文档标记为已删除,并将新的文档索引到相同的位置。这意味着文档更新操作会消耗一定的资源,因为它涉及到文档的删除和索引。

2.2 更新文档

在 Elasticsearch 中,我们可以使用 POST 请求来更新文档。例如,我们可以更新一个名为 users 的索引中的用户文档:

POST /users/_update/1
{"doc": {"age": 31}
}

在这个例子中,我们使用了 POST 请求来更新用户文档。这里我们指定了文档的 ID 为 1,并提供了一个包含更新字段的 doc 对象。需要注意的是,更新操作是部分更新,只会修改指定的字段,不会影响其他字段。

2.3 使用脚本更新文档

在 Elasticsearch 中,我们可以使用脚本(Script)来更新文档。脚本提供了更灵活的更新方式,可以根据文档的当前状态来计算新的值。例如,我们可以使用脚本来更新用户文档的年龄:

POST /users/_update/1
{"script": {"source": "ctx._source.age += params.age_increment","params": {"age_increment": 1}}
}

在这个例子中,我们使用了脚本来更新用户文档。这里我们指定了一个简单的脚本 ctx._source.age += params.age_increment,用于将用户的年龄增加一个指定的值。脚本可以提供更灵活的更新方式,但可能会影响性能。

2.4 更新文档并返回结果

在 Elasticsearch 中,我们可以使用 POST 请求的 return_source 参数来更新文档并返回更新后的文档。例如,我们可以更新用户文档的年龄,并返回更新后的文档:

POST /users/_update/1?_source=true
{"doc": {"age": 32}
}

在这个例子中,我们使用了 POST 请求来更新用户文档,并通过 _source 参数设置为 true 来返回更新后的文档。这样,我们可以在更新文档的同时获取更新后的文档内容。

2.5 更新文档并处理冲突

在 Elasticsearch 中,文档更新操作可能会遇到版本冲突。当多个客户端同时更新同一个文档时,可能会导致数据不一致。为了解决这个问题,我们可以使用 retry_on_conflict 参数来指定更新操作的重试次数。

例如,我们可以更新用户文档的年龄,并在遇到冲突时重试更新操作:

POST /users/_update/1?retry_on_conflict=3
{"doc": {"age": 33}
}

在这个例子中,我们使用了 POST 请求来更新用户文档,并通过 retry_on_conflict 参数设置为 3 来指定重试次数。这样,当遇到版本冲突时,Elasticsearch 会自动重试更新操作,直到成功或达到重试次数限制。

3. 文档删除

3.1 删除文档基本概念

在 Elasticsearch 中,文档删除实际上是一个标记操作。当我们删除一个文档时,Elasticsearch 会将文档标记为已删除,但不会立即从磁盘中移除。在后续的合并(Merge)过程中,Elasticsearch 会自动清理已删除的文档,释放磁盘空间。这意味着文档删除操作通常具有较低的性能开销,但可能会导致磁盘空间暂时浪费。

3.2 删除文档

在 Elasticsearch 中,我们可以使用 DELETE 请求来删除文档。例如,我们可以删除一个名为 users 的索引中的用户文档:

DELETE /users/_doc/1

在这个例子中,我们使用了 DELETE 请求来删除用户文档。这里我们指定了文档的 ID 为 1。删除操作是不可逆的,一旦文档被删除,将无法恢复。

3.3 删除查询匹配的文档

在 Elasticsearch 中,我们可以使用 _delete_by_query API 来删除查询匹配的文档。例如,我们可以删除年龄大于 30 的用户文档:

POST /users/_delete_by_query
{"query": {"range": {"age": {"gt": 30}}}
}

在这个例子中,我们使用了 _delete_by_query API 来删除查询匹配的文档。这里我们指定了一个范围查询,用于匹配年龄大于 30 的用户文档。需要注意的是,删除查询匹配的文档可能会消耗较多的资源,因为它需要遍历所有匹配的文档。

3.4 删除索引中的所有文档

在 Elasticsearch 中,我们可以使用 _delete_by_query API 来删除索引中的所有文档。例如,我们可以删除 users 索引中的所有用户文档:

POST /users/_delete_by_query
{"query": {"match_all": {}}
}

在这个例子中,我们使用了 _delete_by_query API 来删除索引中的所有文档。这里我们指定了一个 match_all 查询,用于匹配所有用户文档。需要注意的是,删除索引中的所有文档可能会消耗较多的资源,因为它需要遍历所有文档。

3.5 删除整个索引

在 Elasticsearch 中,我们可以使用 DELETE 请求来删除整个索引。例如,我们可以删除名为 users 的索引:

DELETE /users

在这个例子中,我们使用了 DELETE 请求来删除整个索引。这里我们指定了索引的名称为 users。删除操作会移除索引中的所有文档以及索引的设置和映射。需要注意的是,删除整个索引是不可逆的,一旦索引被删除,将无法恢复。

4. 批量操作

4.1 批量操作基本概念

在 Elasticsearch 中,批量操作是指在一个请求中执行多个操作,例如索引、更新和删除文档。批量操作可以减少网络开销,提高性能,特别是在需要处理大量文档时。批量操作使用 _bulk API 来实现,支持多种操作类型,包括 index(索引文档)、update(更新文档)和 delete(删除文档)。

4.2 执行批量操作

在 Elasticsearch 中,我们可以使用 _bulk API 来执行批量操作。批量操作的请求体使用换行符(\n)分隔,每个操作都需要以换行符结尾。每个操作由两行组成:第一行是操作的元数据,包括操作类型、索引名和文档 ID;第二行是操作的具体内容,例如文档数据或更新字段。批量操作可以提高性能,因为它可以在一个请求中执行多个操作。例如,我们可以在一个请求中索引、更新和删除多个用户文档:

POST /_bulk
{ "index": { "_index": "users", "_id": "2" } }
{ "name": "Charlie", "age": 22, "email": "charlie@example.com" }
{ "index": { "_index": "users", "_id": "3" } }
{ "name": "David", "age": 28, "email": "david@example.com" }
{ "update": { "_index": "users", "_id": "1" } }
{ "doc": { "age": 32 } }
{ "delete": { "_index": "users", "_id": "2" } }

在这个例子中,我们使用了 _bulk API 来执行批量操作。这里我们在一个请求中执行了多个操作,包括索引、更新和删除。每个操作都由两行组成:第一行是操作的元数据,包括操作类型、索引名和文档 ID;第二行是操作的具体内容,例如文档数据或更新字段。

需要注意的是,批量操作的请求体使用换行符(\n)分隔,每个操作都需要以换行符结尾。此外,批量操作的顺序会影响执行结果,因为操作是按照顺序执行的。

4.3 批量操作的错误处理

在执行批量操作时,可能会遇到错误,例如文档 ID 不存在或版本冲突。Elasticsearch 会在响应中返回错误信息,但不会中止整个批量操作。我们需要检查响应中的错误信息,以确定哪些操作失败并采取相应的措施。

例如,我们可以执行一个包含错误的批量操作:

POST /_bulk
{ "index": { "_index": "users", "_id": "4" } }
{ "name": "Eva", "age": "invalid_age", "email": "eva@example.com" }
{ "delete": { "_index": "users", "_id": "non_existent_id" } }

在这个例子中,我们执行了一个包含错误的批量操作。第一个操作尝试索引一个包含无效年龄的用户文档;第二个操作尝试删除一个不存在的文档。Elasticsearch 会在响应中返回错误信息,我们可以根据错误信息来判断操作是否成功。

4.4 批量操作的性能优化

在使用批量操作时,我们需要关注性能和资源消耗。以下是一些优化批量操作性能的建议:

  • 合理设置批量大小:批量操作的大小会影响性能和资源消耗。过大的批量可能会导致内存不足或请求超时;过小的批量可能会导致网络开销过大。我们需要根据实际情况来选择合适的批量大小。

  • 并行执行批量操作:为了提高性能,我们可以并行执行多个批量操作。这可以充分利用 Elasticsearch 集群的处理能力,提高吞吐量。需要注意的是,并行执行批量操作可能会增加集群的负载,我们需要根据集群的资源和性能来选择合适的并行度。

  • 使用批量操作的顺序执行:在某些情况下,我们可能需要按照顺序执行批量操作,以确保数据的一致性。这可以通过将批量操作分成多个顺序执行的批次来实现。需要注意的是,顺序执行批量操作可能会降低性能,我们需要在性能和一致性之间进行权衡。

  • 优化索引设置和映射:在执行批量操作时,我们需要关注索引的设置和映射,以确保数据的存储和检索效率。例如,我们可以合理设置分片数量、副本数量和刷新间隔,以提高批量操作的性能。同时,我们可以优化字段的类型、分析器和存储选项,以减少资源消耗。

总结

Elasticsearch 提供了丰富的文档操作功能,包括文档的索引、更新、删除以及批量操作。在实际应用中,我们可以根据需求灵活地使用这些功能来管理文档。需要注意的是,在使用文档操作时,应该关注性能和资源消耗,尽量避免使用过于复杂的操作。同时,文档操作通常需要与查询、聚合、分页、排序和高亮功能结合使用,以便提供更好的搜索体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/142141.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【工程实践】Docker使用记录

前言 服务上线经常需要将服务搬到指定的服务器上,经常需要用到docker,记录工作中使用过dcoker指令。 1.写Dockerfile 1.1 全新镜像 FROM nvidia/cuda:11.7.1-devel-ubuntu22.04ENV WORKDIR/data/Qwen-14B-Chat WORKDIR $WORKDIR ADD . $WORKDIR/RUN ap…

洗地机是智商税吗?洗地机有没有必要买?2023洗地机推荐

传统的扫地拖地方式不仅时间长,被毛孩子和萌娃制造的顽固污渍更是让人头痛不已,高效又有效的地面清洁方式成了我们最大的诉求。目前洗地机受到青睐,异常火爆,也成为一众清洁扫地的选择之一,那洗地机到底是不是智商税呢…

C语言从入门到精通之【printf和scanf函数】

printf()是输出函数,scanf()是输入函数,但是它们的工作原理几乎相同。两个函数都使用格式字符串和参数列表。 printf()函数的格式 printf( 格式字符串, 待打印项1, 待打印项2,…);待打印项1、待打印项2等都是要打印的项。它们可以是变量、常量&#xff…

业务出海之服务器探秘

这几年随着国内互联网市场的逐渐饱和,越来越多的公司加入到出海的行列,很多领域都取得了很不错的成就。虽然出海可以获得更加广阔的市场,但也需要面对很多之前在国内可能没有重视的一些问题。集中在海外服务器的选择维度上就有很大的变化。例…

使用validator实现枚举类型校验

使用validator实现枚举类型校验 前言: 在前端调用后端接口传递参数的过程中,我们往往需要对前端传递过来的参数进行校验,比如说我们此时需要对用户的状态进行更新,而用户的状态只有正常和已删除,并且是在代码中通过枚…

react ts实现一个 无限加载组件

页面滑动到底部,直接加载下一页数据 InfiniteScroll.tsx /*** 无限 加载组件*/import { FC, createRef, useEffect, CSSProperties } from react import LoadingText from ../LoadingTexttype PropsType {loadMore: () > voidhasMore: boolean }const Infinit…

【华为云IaaS基础三件套之----计算ECS、网络EIP、存储EVS】

MD[华为云IaaS基础三件套----计算、网络、存储] 华为云IaaS基础三件套之----计算ECS、网络EIP、存储EVS 说明: 这里只是简单从计算/网络/存储,进行介绍,阐明云上对于云下的优势;因ECS是三者综合,故最后说明。 1.网络----弹性公…

STM32 HAL库多路PWM没有输出踩坑记录

之前只弄过单路的,这次想用4路PWM,CUBE里面一顿配置,生成,然后套用之前的代码: HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); 这算是开启第一路了,心想后面无非就复制几条,改下通道的事了&…

算法----删掉一个元素以后全为 1 的最长子数组

题目 给你一个二进制数组 nums ,你需要从中删掉一个元素。 请你在删掉元素的结果数组中,返回最长的且只包含 1 的非空子数组的长度。 如果不存在这样的子数组,请返回 0 。 提示 1: 输入:nums [1,1,0,1] 输出&…

Day02_《MySQL索引与性能优化》

文章目录 一、SQL执行顺序二、索引简介1、关于索引2、索引的类型Btree 索引Btree 索引 三、Explain简介四、Explain 详解1、id2、select_type3、table4、type5、possible_keys6、key7、key_len8、ref9、rows10、Extra11、小案例 五、索引优化1、单表索引优化2、两表索引优化3、…

安装 Lua 的 HTTP 库

首先,你需要安装 Lua 的 HTTP 库。可以使用 LuaRocks 来安装。以下是安装命令: luarocks install http然后,你可以使用以下代码来爬取网页内容: local http require http-- 设置代理信息 http.set_proxy(jshk.com.cn)-- 网页UR…

灵活运用Vue指令:探究v-if和v-for的使用技巧和注意事项

🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 ⭐ 专栏简介 📘 文章引言 一、作…

为什么打开idea时,没有启动页面,如何解决?

更新idea2021.2后,当双击idea打开时,发现没有启动界面,直接进入IDEA界面,中间等待时间,让人误以为没有打开idea成功,使得多次点击idea图标。 解决方案就是 在idea界面菜单栏中找到帮助(Help)&a…

全域全自主建设,亚信科技AntDB数据库助力广电5G业务上线运行

自2019年6月,中国广电成功获得5G牌照以来,迅速推进网络建设目标,成为5G网络覆盖广、应用场景多、用户体验出色的第四大运营商。其依托全球独有的700MHz频谱资源,具备覆盖能力强、容量足、速率高的优势。通过不断深化和中国移动的共…

Redis开发与运维pdf

链接: Redis开发与运维pdf 提取码: rnj7

Gempy 实现地理位置3D模型的展示以及导出

1. 首先安装python gempy 包 pip install gempy python 版本 3.10 这个很重要,版本不同可能会报错 2. gdal 可能会报错, 一下地址根据python版本下载,然后移入到python解释器环境中, Script文件中,然后cmd ,pip install 文件名安装即可 Releases cgohlke/geospatial-wheels …

μC/OS-II---计时器管理2(os_tmr.c)

目录 获取计时器的名字获取计时器到期前剩余的时间查看计时器的状态 计时器是倒计时器,当计数器达到零时执行某个动作。用户通过回调函数提供这个动作。回调函数是用户声明的函数,在计时器到期时被调用。在回调函数中绝对不能进行阻塞调用(例…

常用hivesql记录

前言 hivesql中很多常用的功能,过段时间没有使用就容易忘记,需要去网上搜索,这里总结一下,省的以后还去去搜,供自己以后参考。 查看分区的行 show rowcount extended table_name;创建二级分区表 set hive.default.…

《008.SpringBoot之教务系统》【界面简洁功能简单】

《008.SpringBoot之教务系统》【界面简洁功能简单】 项目简介 [1]本系统涉及到的技术主要如下: 推荐环境配置:DEA jdk1.8 Maven MySQL 前后端分离; 后台:SpringBootMybatis; 前台:JSPBootStrap; [2]功能模块展示: 管…

[文件读取]coldfusion 文件读取 (CVE-2010-2861)

1.1漏洞描述 漏洞编号CVE-2010-2861漏洞类型文件读取漏洞等级⭐⭐漏洞环境VULFOCUS攻击方式 描述: Adobe ColdFusion是美国Adobe公司的一款动态Web服务器产品,其运行的CFML(ColdFusion Markup Language)是针对Web应用的一种程序设计语言。 A…