《深入理解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可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
1月前
|
存储 人工智能 API
(Elasticsearch)使用阿里云 infererence API 及 semantic text 进行向量搜索
本文展示了如何使用阿里云 infererence API 及 semantic text 进行向量搜索。
|
3月前
|
存储 人工智能 自然语言处理
Elasticsearch Inference API增加对阿里云AI的支持
本文将介绍如何在 Elasticsearch 中设置和使用阿里云的文本生成、重排序、稀疏向量和稠密向量服务,提升搜索相关性。
154 14
Elasticsearch Inference API增加对阿里云AI的支持
|
2月前
|
监控 API 索引
Elasticsearch集群使用 _cluster/health API
Elasticsearch集群使用 _cluster/health API
82 2
|
2月前
|
Unix API 索引
Elasticsearch集群使用 _cat/health API
Elasticsearch集群使用 _cat/health API
44 1
|
7月前
|
人工智能 自然语言处理 搜索推荐
Elasticsearch 开放 inference API 增加了对 Azure OpenAI 嵌入的支持
【6月更文挑战第8天】Elasticsearch 推出开放 inference API,支持 Azure OpenAI 嵌入,强化搜索和数据分析能力。此更新使用户能灵活集成 AI 技术,实现智能精准搜索。Azure OpenAI 的语言理解能力优化了用户查询处理,提升搜索相关性。示例代码显示了如何结合两者处理查询。该创新提升数据检索效率,适用于智能客服和推荐系统,但也带来数据安全和模型准确性等挑战。这标志着搜索和数据分析领域的智能化新阶段,期待更多创新应用。未来,我们需要持续探索和完善,以发挥技术的最大潜力。
57 3
|
7月前
|
存储 缓存 Java
掌握Elasticsearch集群参数查询API
掌握Elasticsearch集群参数查询API
|
8月前
|
存储 自然语言处理 搜索推荐
Elasticsearch 8.10 同义词管理新篇章:引入同义词 API
Elasticsearch 8.10 同义词管理新篇章:引入同义词 API
192 1
|
6天前
|
JSON 前端开发 搜索推荐
关于商品详情 API 接口 JSON 格式返回数据解析的示例
本文介绍商品详情API接口返回的JSON数据解析。最外层为`product`对象,包含商品基本信息(如id、name、price)、分类信息(category)、图片(images)、属性(attributes)、用户评价(reviews)、库存(stock)和卖家信息(seller)。每个字段详细描述了商品的不同方面,帮助开发者准确提取和展示数据。具体结构和字段含义需结合实际业务需求和API文档理解。
|
12天前
|
JSON API 数据格式
京东商品SKU价格接口(Jd.item_get)丨京东API接口指南
京东商品SKU价格接口(Jd.item_get)是京东开放平台提供的API,用于获取商品详细信息及价格。开发者需先注册账号、申请权限并获取密钥,随后通过HTTP请求调用API,传入商品ID等参数,返回JSON格式的商品信息,包括价格、原价等。接口支持GET/POST方式,适用于Python等语言的开发环境。
64 11
|
3天前
|
Web App开发 JSON 测试技术
API测试工具集合:让接口测试更简单高效
在当今软件开发领域,接口测试工具如Postman、Apifox、Swagger等成为确保API正确性、性能和可靠性的关键。Postman全球闻名但高级功能需付费,Apifox则集成了API文档、调试、Mock与自动化测试,简化工作流并提高团队协作效率,特别适合国内用户。Swagger自动生成文档,YApi开源但功能逐渐落后,Insomnia界面简洁却缺乏团队协作支持,Paw仅限Mac系统。综合来看,Apifox是国内用户的理想选择,提供中文界面和免费高效的功能。