《深入理解ElasticSearch》——2.6 数据更新API

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介:

本节书摘来自华章计算机《深入理解ElasticSearch》一书中的第2章,第2.6节,作者:[美] 拉斐尔·酷奇(Rafa Ku) 马雷克·罗戈任斯基(Marek Rogoziński)更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.6 数据更新API

在索引一个新文档的时候,Lucene会对每个字段进行分析并产生词条流,词条流中的词条可能会经过滤器的额外处理,而没有过滤掉的词条会写入倒排索引中。索引过程中,一些不需要的信息可能会被抛弃,这些信息包括:某些特殊词条的位置(当词项向量没有存储时),特定词汇(停用词或同义词),词条的变形(如词干还原)。因此,我们无法更新索引中的文档,并且在每次修改文档时不得不向索引发送文档所有字段的数据。但ElasticSearch可以通过使用_source伪字段存储和检索文档的原始数据来解决这个问题。当用户需要更改文档时,ElasticSearch会获取_source字段中的值,做相应的修改,然后向索引提交一个新文档。当然,为了使这个特性生效,_source字段必须是可用的。更新命令一个很大的局限性就是它只能更新单个的文档,目前还不支持通过查询实现批量更新。
如果你不熟悉Apache Lucene的文本分析处理机制或任何前面提到的术语,请参考1.1节(Apache Lucene简介)。
从API的角度来看,文档更新可以通过执行发送至端点的更新请求来实现,也可以通过在更新请求的url中添加_update参数来更新某个特定的文档,如/library/book/1/_update。现在,我们来看看ElasticSearch提供了哪些更新功能。
作为示例,本节的其余部分都将使用下面命令所索引的文档:


<a href=https://yqfile.alicdn.com/71ee79d45b3220ecab1d84119db6fa6364fc18b7.png" >

2.6.1 简单字段更新
在本节的第一个案例里,我们尝试更新指定文档的字段。例如,使用下面的命令:


ebd7a78383e37fd522915d0c751360966449abec

其中,我们更新了文档中的两个字段,title字段与year字段。作为响应,ElasticSearch将返回一个与建索引操作类似的回复:

<a href=https://yqfile.alicdn.com/99e820f53f663b64f3eb1ab8ecf47f2b80dcf9a9.png" >

现在,如果我们想从索引中获取刚才修改的文档,查看那两个字段是否真得修改了,可执行下面的命令:

82d126ecc008b756c0463f53d96d3731efa5b3ab

该命令的响应如下所示:

0f20b624c528d030490163ab89d58921cf9a9050

正如我们所见,_source字段中,title字段与year字段的值已经被修改过了。接下来,我们查看下一个范例,该范例通过脚本来更新文档。
2.6.2 使用脚本按条件更新
有些时候,在修改文档的时候添加一些额外的逻辑是很有好处的,基于这点考虑,ElasticSearch允许用户结合脚本使用更新API。例如,我们发送下面这样的请求:

327aae0eef975a277f5dee9440a7ed5d77866ba2

正如你所见,script字段定义了要对文档进行的操作,这可以是任何脚本。在范例中我们指派了ctx变量来引用源文档,但一般来说,脚本中会定义多个变量。通过使用ctx._source,我们可以修改当前字段或创建新字段(如果引用不存在的字段,ElasticSearch会自动创建这个字段),这正是范例中ctx._source.year = new_date语句产生的动作。此外,也可以使用remove()方法来移除某些字段,例如:

6791f59ea962e9a37633781bad5c7ab5a2a8b875

2.6.3 使用更新 API创建或删除文档
更新API不仅仅可以用来修改字段,也可以用来操作整个文档。upsert属性允许用户在当URL中地址不存在时创建一个新的文档。请查看下面这个命令:

fa3a02a0c1e6e384c860f6ede65b7922f8f0870a

该命令修改了某个已有文档的year字段(该文档位于索引library中,book类型,文档ID为1)。如果该文档不存在,将会创建一个新文档,并且该文档会创建一个新字段title,如请求命令中upset部分定义的那样。此外,前面的命令也可以使用脚本重写为以下形式:

<a href=https://yqfile.alicdn.com/d0960e7238fe7938c44126482228e4095211e3dc.png" >

最后一个有趣的特性是有条件地移除整个文档,具体可以通过设置ctx.op的值为delete来实现。例如,可以通过下面的命令从索引中删除文档:

<a href=https://yqfile.alicdn.com/5854c569f0e9259deab0eca73a4754a1046a81a7.png" >

当然,我们可以使用脚本实现更复杂的逻辑来删除满足特定规则的文档。
相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
2月前
|
存储 API 索引
Elasticsearch Reroute API 的使用
Elasticsearch Reroute API 的使用
39 1
|
3月前
|
存储 JSON 自然语言处理
Elasticsearch 利用API进行搜索
Elasticsearch 利用API进行搜索
35 0
|
7月前
|
JSON Java 测试技术
Elasticsearch常用Java API编程 1
Elasticsearch常用Java API编程
73 0
|
4月前
|
安全 大数据 API
elasticsearch|大数据|elasticsearch的api部分实战操作以及用户和密码的管理
elasticsearch|大数据|elasticsearch的api部分实战操作以及用户和密码的管理
62 0
|
4月前
|
Java API
SpringBoot【集成ElasticSearch 01】2种方式的高级客户端 RestHighLevelClient 使用(依赖+配置+客户端API测试源码)
SpringBoot【集成ElasticSearch 01】2种方式的高级客户端 RestHighLevelClient 使用(依赖+配置+客户端API测试源码)
75 0
|
7月前
|
JSON Java 测试技术
Elasticsearch常用Java API编程 2
Elasticsearch常用Java API编程
45 0
|
7月前
|
Java API 数据安全/隐私保护
Elasticsearch Java API Client 开发
本场景主要介绍如何使用 Elasticsearch Java API Client 进行开发,实现常用的 CRUD 操作。
146 0
|
10天前
|
缓存 前端开发 API
API接口封装系列
API(Application Programming Interface)接口封装是将系统内部的功能封装成可复用的程序接口并向外部提供,以便其他系统调用和使用这些功能,通过这种方式实现系统之间的通信和协作。下面将介绍API接口封装的一些关键步骤和注意事项。
|
17天前
|
监控 前端开发 JavaScript
实战篇:商品API接口在跨平台销售中的有效运用与案例解析
随着电子商务的蓬勃发展,企业为了扩大市场覆盖面,经常需要在多个在线平台上展示和销售产品。然而,手工管理多个平台的库存、价格、商品描述等信息既耗时又容易出错。商品API接口在这一背景下显得尤为重要,它能够帮助企业在不同的销售平台之间实现商品信息的高效同步和管理。本文将通过具体的淘宝API接口使用案例,展示如何在跨平台销售中有效利用商品API接口,以及如何通过代码实现数据的统一管理。

热门文章

最新文章