袁庭新ES系列10节 | 使⽤kibana对⽂档操作

前言

在前面的小节中,我们已经给大家介绍了Elasticsearch中文档的相关概念,想必有些同学都已经忘记了,那我们一块儿再来回顾下,文档即索引库中某个类型下的数据,会根据规则创建索引,将来用来搜索。可以类比做数据库中的每一行数据。本章节袁老师继续带领同学们来探索Elasticsearch文档操作的相关内容。

一. 文档增删改查操作

1.新增文档

1.1 新增文档并随机生成id

通过POST请求,可以向一个已经存在的索引库中添加文档数据。

语法格式:

POST /索引库名/类型名
{"key":"value"
}

演示示例:

POST /yx/goods
{"title": "小米手机","images": "http://image.yx.com/12479122.jpg","price": 2699.00
}

响应结果:

{"_index": "yx","_type": "goods","_id": "v0aZtYIBep1a4UbIQ74E","_version": 1,"result": "created","_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 0,"_primary_term": 1
}

上述代码运行结果见下:

另外,需要注意的是,在响应结果中有一个_id字段,这个就是这条文档数据的唯一标识,以后的增删改查都依赖这个id作为唯一标识。

可以看到id的值为v0aZtYIBep1a4UbIQ74E,这里我们新增时没有指定id,所以是ES帮我们随机生成的id。

1.2 新增文档并自定义id

如果我们想要自己新增的时候指定id,可以这么做。

语法格式:

POST /索引库名/类型/id值
{...
}

演示示例:

POST /yx/goods/1
{"title": "大米手机","images": "http://image.yx.com/12479122.jpg","price": 2899.00
}

响应结果:

{"_index": "yx","_type": "goods","_id": "1","_version": 1,"result": "created","_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 1,"_primary_term": 1
}

上述代码运行结果见下:

通过运行的响应结果可以看出,新增的文档数据的`_id`字段的取值为1,表明自定义分配id值生效。

2.查看文档

根据Rest风格,新增是POST,查询是GET,不过查询一般都需要条件,这里我们把刚刚生成数据的id带上。

通过Kibana查看数据:

GET /yx/goods/v0aZtYIBep1a4UbIQ74E

响应结果:

{"_index": "yx","_type": "goods","_id": "v0aZtYIBep1a4UbIQ74E","_version": 1,"found": true,"_source": {"title": "小米手机","images": "http://image.yx.com/12479122.jpg","price": 2699}
}

属性说明:

属性

描述

_source

源文档信息,所有的数据都在里面

_id

这条文档的唯一标识

自动生成的id,长度为20个字符,URL安全,Base64编码,GUID(全局唯一标识符)分布式系统并行生成时不可能会发生冲突。

在实际开发中不建议使用ES生成的id,太长且为字符串类型,检索时效率低。建议将数据表中唯一的id,作为ES的文档id。

3.修改数据

PUT表示修改文档。不过修改必须指定id。分为以下两种情况:

  • 如果id对应的文档存在,则修改。
  • 如果id对应的文档不存在,则新增。

比如我们使用id为2不存在的一个id,则是新增数据:

PUT /yx/goods/2
{"title": "玉米手机","images": "http://image.yx.com/12479122.jpg","price": 3899.00,"stock": 100,"saleable": true
}

响应结果:可以看到输出结果中的result属性的取值为created ,表示是新增数据操作。

{"_index": "yx","_type": "goods","_id": "2","_version": 1,"result": "created","_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 0,"_primary_term": 1
}

上述代码运行结果见下:

我们再次执行刚才的请求,不过把数据调整一下:

PUT /yx/goods/2
{"title": "大米手机","images": "http://image.yx.com/12479133.jpg","price": 4899.00,"stock": 200,"saleable": true
}

查看结果:可以看到输出结果中的result属性的取值为updated,表示是更新数据操作。

{"_index": "yx","_type": "goods","_id": "2","_version": 2,"result": "updated","_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 1,"_primary_term": 1
}

上述代码运行结果见下:

4.删除数据

4.1 删除数据操作

删除使用DELETE请求,同样需要根据id进行删除。语法格式:

DELETE /索引库名/类型名/id值

演示示例:

DELETE /yx/goods/2

响应结果:

{"_index": "yx","_type": "goods","_id": "2","_version": 3,"result": "deleted","_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 2,"_primary_term": 1
}

上述代码运行结果见下:

4.2 删除数据出错问题

4.2.1 问题原因

在执行删除数据操纵提示如下错误。

{"error": {"root_cause": [{"type": "cluster_block_exception","reason": "blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];"}],"type": "cluster_block_exception","reason": "blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];"},"status": 403
}

经查阅资料发现,此问题是由于ES数据存储磁盘剩余空间过少导致的。即ES存在一种flood_stage的机制。默认的磁盘空间设置为95%,当磁盘占用超过此值阈值时,将会触发flood_stage机制,ES强制将各索引index.blocks.read_only_allow_delete设置为true,即ES索引均被设置为仅允许只读只删,不允许新增。

4.2.2 解决方法

1.在kibana中执行以下命令。

PUT /yx/_settings
{"index.blocks.read_only_allow_delete": null
}

说明:执行完以后,无需重启。

2.或者主机上直接执行如下命令。

(1) 在主机上直接执行此命令。

curl -XPUT -H "Content-Type: application/json"  http://localhost:9200/_all/_settings -d '{"index.blocks.read_only_allow_delete": null}'

(2) 在主机上直接执行此命令。

curl -X PUT "localhost:9200/twitter/_settings?pretty" -H 'Content-Type: application/json' -d'
{"index.blocks.read_only_allow_delete": null
}
'

说明:以上两种方式二选其一。

二. 智能判断

刚刚我们在新增数据时,添加的字段都是提前在类型中定义过的,如果我们添加的字段并没有提前定义过,能够成功吗?

事实上Elasticsearch非常智能,你不需要给索引库设置任何mapping映射,它也可以根据你输入的数据来判断类型,动态添加数据映射。

演示示例:我们额外添加stock库存、saleable是否上架、subTitle副标题这3个字段。

POST /yx/goods/2
{"title":"IPhone手机","images": "http://image.yx.com/12479122.jpg","price": 6299.00,"stock": 200,"saleable": true,"subTitle": "IPhone 15 Pro"
}

响应结果:

{"_index": "yx","_type": "goods","_id": "2","_version": 1,"result": "created","_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 3,"_primary_term": 1
}

上述代码运行结果见下:

查询yx索引库:

GET /yx

响应结果:

{"yx": {"aliases": {},"mappings": {"goods": {"properties": {"images": {"type": "keyword","index": false,"store": true},"price": {"type": "float"},"saleable": {"type": "boolean"},"stock": {"type": "long"},"subTitle": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}},"title": {"type": "text","store": true,"analyzer": "ik_max_word"}}}},"settings": {"index": {"creation_date": "1660814323683","number_of_shards": "5","number_of_replicas": "1","uuid": "6WjjnjWwSs6HAoN4tM_XnQ","version": {"created": "6020499"},"provided_name": "yx"}}}
}

通过响应结果可以发现stock、saleable、subTitle字段都被成功添加到了yx索引库中的映射中。

在对subTitle字段做数据初始化的时候,设置的是字符串类型数据,ES无法智能判断,它就会存入两种字段类型。例如:

  • subtitle:text类型
  • subtitle.keyword:keyword类型

这种智能映射,底层原理是动态模板映射,如果我们想修改这种智能映射的规则,其实只要修改动态模板即可。

三. 动态模板

1.动态模板介绍

动态模板允许您更好地控制Elasticsearch如何在默认动态字段映射规则之外映射数据。通过将动态参数设置为true或runtime,可以启用动态映射。然后,您可以使用动态模板定义自定义映射,这些映射可以应用于基于匹配条件动态添加的字段:

  • match_mapping_type:对Elasticsearch检测到的数据类型进行操作。
  • match和unmatch :使用模式匹配字段名。
  • path_match和path_unmatch:在字段的全点路径上操作。
  • 如果动态模板未定义match_mapping_type、match或path_match,则不会匹配任何字段。您仍然可以在批量请求的dynamic_templates部分中按名称引用模板。

在映射规范中使用{name}和{dynamic_type}模板变量作为占位符。

提醒:只有当字段包含具体值时,才会添加动态字段映射。当字段包含null或空数组时,Elasticsearch不会添加动态字段映射。如果在dynamic_template中使用了null_value选项,那么它只会在第一个具有该字段具体值的文档被索引之后才会被应用。

动态模板指定为命名对象数组:

"dynamic_templates": [{"my_template_name": { ... match conditions ... "mapping": { ... } }},...
]

1.模板名称可以是任何字符串值。

2.匹配条件可以包括以下任一项:match_mapping_type、match、match_pattern、unmatch、path_match、path_unmatch。凡是符合条件的未定义字段,都会按照这个规则来映射。

3.匹配字段应使用的映射。

2.动态模板案例

举例,我们可以把所有未映射的string类型数据自动映射为keyword类型。

PUT ytr
{"mappings": {"goods": {"properties": {"title": {"type": "text","analyzer": "ik_max_word"}},"dynamic_templates": [{"strings": {"match_mapping_type": "string","mapping": {"type": "keyword","index": false,"store": true}}}]}}
}

在这个案例中,我们定义了两个映射配置:

  • title字段:统一映射为text类型,并制定分词器。
  • 其它字段:只要是string类型,统一都处理为keyword类型。

这样,未知的string类型数据就不会被映射为text和keyword并存,而是统一以keyword来处理。我们试试看新增一个数据:

POST /ytr/goods/1
{"title": "大米手机","images": "http://image.yx.com/12479122.jpg","price": 3299.00
}

上述代码运行结果见下:

我们只对title做了配置,现在来看看images和price会被映射为什么类型。

GET /ytr/_mapping

响应结果:

{"ytr": {"mappings": {"goods": {"dynamic_templates": [{"strings": {"match_mapping_type": "string","mapping": {"index": false,"store": true,"type": "keyword"}}}],"properties": {"images": {"type": "keyword","index": false,"store": true},"price": {"type": "float"},"title": {"type": "text","analyzer": "ik_max_word"}}}}}
}

可以看到images被映射成了keyword,而非之前的text和keyword并存,说明我们的动态模板生效了。

上述代码运行结果见下:

四. 结语

这一章节的内容比较多,赶紧趁热打铁复习下所学的内容。首先,介绍了在ES中文档的增删改查的操作;然后,介绍了ES的智能判断,动态添加数据映射。最后,介绍了ES中的动态模板相关的语法并进行了案例演示。其中,涉及了一些语法和概念,需要去加深记忆和巩固。这一章节的内容,就给大家介绍到这里,那就期待袁老师的下一篇文章吧。

今天的内容就分享到这里吧。关注「袁庭新」,干货天天都不断!

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

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

相关文章

HTML+CSS:动态搜索框

效果演示 这段代码实现了一个简单的搜索栏效果。页面背景为从天蓝色到深蓝色的渐变色,搜索栏包括一个圆形背景的搜索图标和一个输入框。当用户点击搜索图标时,输入框会从搜索图标的位置滑出,显示一个输入框和一个清除按钮。用户可以在输入框中…

Unity(第三部)新手绘制地形

1、创建地形 游戏对象3d对象地形 2、功能 1、 红框内按键为创建相邻地形、点击后相近地形会呈现高亮框、点击高亮区域可以快速创建地形 每块地形面积是1km*1km 2、第二个按钮是修改地形 下面的选择是修改类型 选项含义描述Raise or Lower Terrain升高或降低地形单击左键可…

pikachu靶场-File Inclusion

介绍: File Inclusion(文件包含漏洞)概述 文件包含,是一个功能。在各种开发语言中都提供了内置的文件包含函数,其可以使开发人员在一个代码文件中直接包含(引入)另外一个代码文件。 比如 在PHP中,提供了&…

5G网络(接入网+承载网+核心网)

5G网络(接入网承载网核心网) 一、5G网络全网架构图 这张图分为左右两部分,右边为无线侧网络架构,左边为固定侧网络架构。 无线侧:手机或者集团客户通过基站接入到无线接入网,在接入网侧可以通过RTN或者IP…

如何在Linux Ubuntu系统使用Docker快速部署MongoDB并公网访问

文章目录 前言1. 安装Docker2. 使用Docker拉取MongoDB镜像3. 创建并启动MongoDB容器4. 本地连接测试5. 公网远程访问本地MongoDB容器5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定TCP地址远程访问 前言 本文主要介绍如何在Linux Ubuntu系统使用Docker快速部署Mon…

互联网加竞赛 机器视觉 opencv 深度学习 驾驶人脸疲劳检测系统 -python

文章目录 0 前言1 课题背景2 Dlib人脸识别2.1 简介2.2 Dlib优点2.3 相关代码2.4 人脸数据库2.5 人脸录入加识别效果 3 疲劳检测算法3.1 眼睛检测算法3.2 打哈欠检测算法3.3 点头检测算法 4 PyQt54.1 简介4.2相关界面代码 5 最后 0 前言 🔥 优质竞赛项目系列&#x…

8.qt5使用opencv的库函数打开图片

1.配置opencv动态库的环境变量 2.在创建的qt工程中加入如下opencv代码,具体代码如下: 使用opencv库函数显示图片

Linux进一步研究权限-----------ACL使用

一、使用情况 1.1、场景: 某个大公司,在一个部门,有一个经理和手下有两个员工,在操控一个Linux项目,项目又分为三期做,然而一期比较重要,经理带着员工做完了,公司就觉得技术难点已经做完攻克了&#xff0…

【自然语言处理-二-attention注意力 是什么】

自然语言处理二-attention 注意力机制 自然语言处理二-attention 注意力记忆能力回顾下RNN(也包括LSTM GRU)解决memory问题改进后基于attention注意力的modelmatch操作softmax操作softmax值与hidder layer的值做weight sum 计算和将计算出来的和作为memo…

《Python 语音转换简易速速上手小册》第1章 Python语音处理概述(2024 最新版)

文章目录 1.1 语音处理的基础1.1.1 基础知识1.1.2 主要案例:自动语音识别系统案例介绍案例 Demo案例分析1.1.3 扩展案例 1:智能虚拟助手案例介绍案例 Demo案例分析1.1.4 扩展案例 2:情感分析系统案例介绍案例 Demo

NATS学习笔记(一)

NATS是什么? NATS是一个开源的、轻量级、高性能的消息传递系统,它基于发布/订阅模式,由Apcera公司开发和维护。 NATS的功能 发布/订阅:NATS的核心是一个发布/订阅消息传递系统,允许消息生产者发布消息到特定的主题…

2024生物发酵魅力展示会-光德流体

参展企业介绍 河北光德流体控制有限公司始建于1996年,是一家从事以不锈钢为母材的洁净应用材料研发与专业制造的实体企业。产品主要包括卫生级球阀,隔膜阀,蝶阀等,并广泛应用于生物发酵,医疗制药,食品饮料…

初识51单片机

##江科大51单片机学习 什么是单片机??? 单片机,英文名,Micro Controller Unit,简称MCU(tips:有人会简称它为CPU,但不是如此,CPU其实被集成在MCU中&#xff…

视频评论抓取软件|抖音数据抓取工具

最近我们推出了一款基于C#语言开发的工具。这款工具提供了丰富的功能,旨在帮助用户轻松获取抖音视频内容。让我们一起来详细介绍一下这款工具的主要功能模块: 1. 批量视频提取: 工具提供了便捷的批量视频提取功能,用户只需输入关…

第3部分 原理篇2去中心化数字身份标识符(DID)(3)

3.2.2.4. DID文档 (DID Document) 本聪老师:DID标识符和DID URL还都只是ID,必须为它附加一个基本属性才可以证明是该主体独有的。这个就是我们下面介绍的DID文档。 本聪老师:每个DID标识符都唯一对应一个DID文档,也可以说&#x…

潇洒郎:2024 IDEA、Pycharm获取最新激活码获取方式

IDEA获取最新激活码 https://idea.javatiku.cn/ 手机打开,看到验证码,30分钟有效,输入验证码 获取到最新激活码

Redis(十六)缓存预热+缓存雪崩+缓存击穿+缓存穿透

文章目录 面试题缓存预热缓存雪崩解决方案 缓存穿透解决方案 缓存击穿解决方案案例:高并发聚划算业务 总结表格 面试题 缓存预热、雪崩、穿透、击穿分别是什么?你遇到过那几个情况?缓存预热你是怎么做的?如何避免或者减少缓存雪崩?穿透和击穿有什么区别?他两是…

基于大数据的智能家居销量数据分析

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式 🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 &…

[HTML]Web前端开发技术28(HTML5、CSS3、JavaScript )JavaScript基础——喵喵画网页

希望你开心,希望你健康,希望你幸福,希望你点赞! 最后的最后,关注喵,关注喵,关注喵,佬佬会看到更多有趣的博客哦!!! 喵喵喵,你对我真的…

HTTP概要

文章目录 什么是HTTP?URL的结构请求报文结构请求方法GETHEADPOSTPUTDELETETRACEOPTIONSCONNECTPATCH解释 请求头字段 响应报文结构响应状态响应头字段 HTTP会话3次握手无状态协议 什么是HTTP? HTTP,即Hypertext Transfer Protocol(超文本传输协议) 它是一个”请…