ElasticSearch 7.4学习记录(基础概念和基础操作)

若你之前从未了解过ES,本文将由浅入深的一步步带你理解ES,简单使用ES。作者本人就是此状态,通过学习和梳理,产出本文,已对ES有个全面的了解和想法,不仅将知识点梳理,也涉及到自己的理解,初次学习踩的坑都汇总如下。

1 了解ElasticSearch

对于第一次接触ES的读者,该章节将直观的带你体验ES的魅力。

1.1 为何使用ES

使用前

           案例:需模糊查询带有 **华为** 的商品信息

使用MySQL的查询功能:select * from 表名 where name like “%华为%”
模糊查询会导致索引失效,就会全表扫描,效率低

           案例:需模糊查询带有 **华为手机** 的商品信息

使用MySQL的查询功能:select * from 表名 where name like “%华为手机%”
只能找到 华为手机 这样的结果
无法找到 华为荣耀手机华为耳机手机这样的结果,意思就是无法将华为+手机分开查询。这也是MySQL查询功能弱的缺点

使用后

输入 ”华为手机
结果展示: 华为荣耀手机华为耳机手机华为手机,且查询效率高

上述案例旨在告诉读者,面对更复杂的业务场景和搜索需求,单纯的SQL查询远远不能满足,MySQL是存储数据的解决方案,ES则是面对海量数据执行搜索的解决方案。

现在简单了解一下ES是怎么做到的上述优点

1.1 倒排索引

  • 在了解倒排索引概念之前,先看看正向索引

                   案例 :查找含有 明 这个字的诗句
    
数据库信息是否匹配
锄禾日当午x
忽如一夜春风来x
窗前明月光

结果:窗前明月光
缺点:得从第每首诗的第一行的第一个字找,这种正向操作的思想会导致查询比较慢

  • 倒排索引

                 案例: 查找含有 是 这个字的诗句
    

内部操作:
ES内部会自动的窗前明月光这个数据进行分词

拆分单词结果
窗前窗前明月光
窗前明月光
窗前明月光
明月窗前明月光
窗前明月光
窗前明月光
窗前明月光

找到关键字 明,得到对应的结果,效率很快的。我们习惯性将这种不直接查询的设计叫倒排索引

案例升级
此时需要在数据库中再存储一条数据”明月几时有“,ES会如何操作?
当然是自动拆分这句话

拆分单词结果
窗前窗前明月光
窗前明月光
窗前明月光
明月窗前明月光;明月几时有
窗前明月光;明月几时有
窗前明月光;明月几时有
窗前明月光
几时明月几时有
明月几时有

拆分的单词若已经有了,直接存储在后面就行;若拆分的单词是新的,则续上。

  • 优化倒排索引

考虑一下这个情况,若拆分单词是 的结果有很多很多,岂不是这个表就很大,如何处理?
可以这样设计

拆分单词结果(ID)
窗前《静夜思》
《静夜思》
《静夜思》
明月《静夜思》;《水调歌头》
《静夜思》;《水调歌头》
《静夜思》;《水调歌头》
《静夜思》
几时《水调歌头》
《水调歌头》

根据拆分单词找到诗词名称,再根据诗词名称去查对应的内容。这样一个表就拆成两个表,就不大了。此外,这里的诗词名称就是唯一标识,在ES引擎中用 ID 表示。

从这里我们才真正的进入ES引擎

  1. 我们的数据格式是Json,存在文档中
{"id":"1","title":"华为折叠手机","price":"120.00"
}
-----------------------------------------
{"id":"2","title":"三星翻盖手机","price":"40.00"
}
-----------------------------------------
{"id":"3","title":"华为移动翻盖手机","price":"90.00"
}
  1. 自动拆分得到表
termvalue
华为1,3
折叠1
1,2,3
手机1,2,3
三星2
翻盖2,3
移动3

若term列数据很多,那直接从上往下一个个匹配也是会很慢的,因此ES引擎对词条term列做了优化。
在生成倒排索引(此表)后,词条会排序,形成一颗树形结构(又称为:字典树),提升词条的查询速度。

ES的定位:mysql的数据只要一更新,就将索引同步给ES,保证数据一致性
在这里插入图片描述

2 安装ES

2.1 环境

CentOS 7
elasticsearch-7.4.0-linux-x86_64.tar.gz

2.2 将安装包解压在opt目录下

在这里插入图片描述

2.3 解压

tar -zxvf elasticsearch-7.4.0-linux-x86_64.tar.gz -C /opt

在这里插入图片描述

2.3 修改elasticsearch.yml文件

在这里插入图片描述

cluster.name: my-application  //默认名称是elasticserach
node.name: node-1 
network.host: 0.0.0.0  //保证在windows上可以访问安装在centos上的ES引擎
http.port: 9200 
cluster.initial_master_nodes: ["node-1"]

2.4 启动报错

在这里插入图片描述
这是因为ES不推荐以root身份启动,而是推荐以用户身份启动
我们已经有用户zjh,只需要给其赋予启动权限就好
在这里插入图片描述

2.5 修改用户配置文件

  1. vim /etc/security/limits.conf
添加此信息
zjh soft nofile 65536
zjh hard nofile 65536
  1. vim /etc/security/limits.d/20-nproc.conf
添加此信息
zjh soft nofile 65536
zjh hard nofile 65536
*   hard nproc  4096

在这里插入图片描述
3. vim /etc/sysctl.conf

添加此信息vm.max_map_count=655360
  1. sysctl -p

2.6 切换用户重启ES

启动前先暂时关闭防火墙
在这里插入图片描述
再启动
在这里插入图片描述
输入自己的虚拟机IP:9200
在这里插入图片描述

3 安装Kibana

Kibana版本必须和ES版本对应,避免出现不兼容的问题。

链接: Kibana下载

  1. 解压 tar -xzf kibana-7.4.0-linux-x86_64.tar.gz -C /opt
    在这里插入图片描述

2.修改配置文件vim /opt/kibana-7.4.0-linux-x86_64/config/kibana.yml

# 添加如下内容
server.port: 5601
server.hosts: "0.0.0.0"
server.name: "kibana-itcast"
elasticsearch.hosts: ["http://127.0.0.1:9200"]
elasticsearch.requestTimeout: 99999

在这里插入图片描述

3.执行报错,需切换身份
在这里插入图片描述
4.切换身份执行

4 ES核心概念

本章节讲述如下几个概念:索引、映射、文档、倒排索引

这是一个mysql数据库处理数据的过程:创建表,将数据存储到对应字段(创建Movice表,Animal表结构)

在这里插入图片描述
这里我们也是创建表,不过在ES中不这样称呼,而是称之为建立索引。(创建Movice与Animal索引,并给索引Movice,索引Animla创建映射),然后存储数据,最后将相关字段进行分词。

在这里插入图片描述

5-8章节主要介绍在Kibana的可视化环境中,使用脚本进行相关操作,帮助熟悉ES

5 索引–基础操作

不能修改索引

5.1 创建索引

在这里插入图片描述

5.2 查询索引

在这里插入图片描述

5.3 添加映射

在这里插入图片描述

5.4 查询索引映射

在这里插入图片描述

在这里插入图片描述

5.5 删除索引

在这里插入图片描述

5.6 创建索引并添加映射

在这里插入图片描述

5.7 添加字段

在这里插入图片描述

6 文档–基础操作

6.1 添加文档,指定id

在这里插入图片描述

6.2 添加文档,不指定id

在这里插入图片描述

6.3 修改文档

在这里插入图片描述

6.4 查询所有文档

在这里插入图片描述

6.5 删除文档,根据id

在这里插入图片描述

7 分词器(analyze)

在这里插入图片描述
但是其对中文很不友好,使用ES的内置分词器,中文只会被分成一个一个字,中英文分别演示一下
中文彻底被拆分成了一个个字
在这里插入图片描述
英文是按照单词拆分的,并不是按照字母拆分。
在这里插入图片描述
因此若想要更好的中文分词效果,需要安装其他的分词器(如IK分词器),这里不介绍了。

8 文档查询

8.1 term

term:查询的条件字符串和词条完全匹配
例:查询与“美”相关的title
在这里插入图片描述
需要注意的是,ES默认使用的standard分词器,因此仅支持单独的汉字匹配,例如这样
在这里插入图片描述

若想要更改分词器,只能重新建立索引映射,同时设置分词器
在这里插入图片描述

8.2 match

会先对查询的字符串进行分词,再去查询,得到并集
例:将“美国”按照standard的分词器进行拆分,得到“美” “国”,分别查询,求并集。
在这里插入图片描述

9 与springboot的整合

在springboot中,我们一般只操作文档。在kibana使用脚本建立索引。这一章节介绍一下如何使用代码操作ES中的文档

9.1 简单获取cilent对象

ES将相关的操作都封装成在RestHighLevelClient 中,因此我们需要获取其对象才能进行相关操作
创建一个springboot项目,导入依赖

        <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.9.0</version></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-client</artifactId><version>7.9.0</version></dependency><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.9.0</version></dependency>

测试 获取ES客户端对象

@SpringBootTest
class EsDemoApplicationTests {/*** HttpHost的三个参数* 	1. 192.168.xx.xx:5601 地址是Kibana的地址和端口号* 	2. 9002 是ES的端口* 	3. scheme:http*/@Testvoid test01() {RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("ipxxxx:5601",9002,"http")));System.out.println(client);}}

成功获取client对象
在这里插入图片描述
获取了client就可以操作ES的文档

9.2 使用依赖注入方式优化获取Client

可以发现,我们直接将HttpHost的三个参数写死了,项目中不这样建议。

  1. 创建elasticsearch.yml文件
elasticsearch:host: 192.168.67.18:5601port: 9200
  1. 创建配置类(获取Client)
@Configuration
// 获取elasticsearch.yml文件信息,自动将elasticsearch.yml文件中elasticsearch开头的字段和ESconfig 类中的字段匹配并赋值
@ConfigurationProperties(prefix = "elasticsearch")
public class ESconfig {private String host;private int port;public String getHost() {return host;}public void setHost(String host) {this.host = host;}public int getPort() {return port;}public void setPort(int port) {this.port = port;}@Beanpublic RestHighLevelClient client(){//1. 创建ES客户端对象RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost(host, port, "http")));return client;}
}
  1. 测试
@SpringBootTest
class EsDemoApplicationTests {@Autowiredprivate RestHighLevelClient client;@Testvoid test01() {/* RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("ipxxxx:5601",9002,"http")));*/System.out.println(client);}}

9.3 索引相关(了解)

9.3.1 创建索引

    /*** 创建索引*/@Testvoid addIndex() throws IOException {//获取操作索引的对象IndicesClient indices = client.indices();//创建索引,获取返回值CreateIndexRequest createIndexRequest = new CreateIndexRequest("movice");//设置映射mappingsString mapping = "{\n" +"      \"properties\" : {\n" +"        \"addres\" : {\n" +"          \"type\" : \"text\"\n" +"        },\n" +"        \"id\" : {\n" +"          \"type\" : \"integer\"\n" +"        },\n" +"        \"price\" : {\n" +"          \"type\" : \"integer\"\n" +"        },\n" +"        \"title\" : {\n" +"          \"type\" : \"text\"\n" +"        }\n" +"      }";createIndexRequest.mapping(mapping, XContentType.JSON);CreateIndexResponse response = indices.create(createIndexRequest, RequestOptions.DEFAULT);//根据返回值判断结构:成功了返回trueSystem.out.println(response.isAcknowledged());}

也就是这效果
在这里插入图片描述

9.3.2 查询索引

/*** 查询索引*/@Testvoid queryIndex() throws IOException {//获取操作索引的对象IndicesClient indices = client.indices();//根据索引名称查询GetIndexRequest getIndexRequest = new GetIndexRequest("movice");GetIndexResponse response = indices.get(getIndexRequest, RequestOptions.DEFAULT);//获取映射信息Map<String, MappingMetadata> mappings = response.getMappings();for (String key: mappings.keySet()){System.out.println(key + ":" + mappings.get(key).getSourceAsMap());}}

最后获得的结果是这一部分
在这里插入图片描述
解释代码
key:索引名称
mappings.get(key):索引对象
mappings.get(key).getSourceAsMap():将数据转换为map集合

9.3.3 删除索引

    /*** 删除索引*/@Testvoid deleteIndex() throws IOException {//获取操作索引的对象IndicesClient indices = client.indices();//根据索引名称删除DeleteIndexRequest request = new DeleteIndexRequest("movice");AcknowledgedResponse response = indices.delete(request, RequestOptions.DEFAULT);//成功返回trueboolean acknowledged = response.isAcknowledged();System.out.println(acknowledged);}

9.3.4 判断索引是否存在

 /*** 判断索引是否存在*/@Testvoid existsIndex() throws IOException {//获取操作索引的对象IndicesClient indices = client.indices();//根据索引名称删除GetIndexRequest request = new GetIndexRequest("movice");boolean exists = indices.exists(request, RequestOptions.DEFAULT);System.out.println(exists);}

9.4 文档相关(重点)

9.4.1 添加文档

按照这样的思路去撰写
在这里插入图片描述

在这里插入图片描述

但是一般我们不这样存入数据,不会一个个put,而是从数据库中拉取数据,封装成对象,存入文档

升级改造

  1. 创建索引的类(movice类)
public class movice {private Integer  id;private String title;private Integer price;private String address;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public Integer getPrice() {return price;}public void setPrice(Integer price) {this.price = price;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return "movice{" +"id=" + id +", title='" + title + '\'' +", price=" + price +", address='" + address + '\'' +'}';}
}
  1. 使用类传入数据
 /*** 添加文档(升级改造):使用对象作为数据*/@Testvoid addDoc2() throws IOException {movice movice = new movice();movice.setId(1); //此为索引IDmovice.setTitle("国产动作电影(我被修改了)");movice.setPrice(40);movice.setAddress("香港");//将对象转换为jsonString data = JSON.toJSONString(movice);// 获取操作文档的对象:文档的ID设置为1IndexRequest request = new IndexRequest("movice").id("1").source(data,XContentType.JSON);IndexResponse response = client.index(request, RequestOptions.DEFAULT);//索引IDSystem.out.println(response.getId());}

9.4.2 修改文档

还是添加相关的操作,只不过若添加的时候,ID已经存在了,就会被修改。不存在就会创建新的

9.4.3 根据ID查询文档

    /*** 查询文档:根据ID查询*/@Testvoid queryDoc2() throws IOException {//GetRequest getrequest = new GetRequest("movice"); //指定索引名称GetRequest getrequest = new GetRequest("1"); //指定索引IDGetResponse response = client.get(getrequest, RequestOptions.DEFAULT);//将对象的source部分数据以字符串的形式处理,前面是以map形式处理System.out.println(response.getSourceAsString());}

response相应也就是这一部分数据。
在这里插入图片描述

9.4.4 删除文档

 /*** 根据ID删除文档*/@Testvoid deleteDoc2() throws IOException {DeleteRequest request = new DeleteRequest("1");DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);//获取数据中的_id,注意不是_source中的id哦System.out.println(response.getId());}

我们可能会疑惑,这个response到底是什么数据,这就是response全部数据,我们可以获取_id,_source,_index等等,但是直接
在这里插入图片描述

总结:其实可以发现,使用代码进行索引,文档的操作时候。一定要了解5-8章节的细节:如何指定ID查询,增删查操作返回的数据。然后再去看代码,一一对照。
在代码中

  1. 先获得RestHighLevelClient对象 client(熟记如何获取)
  2. 上述所操作的类梳理在这里插入图片描述
    非常清晰的看到如何使用代码操作ES。

在下一篇文章将会介绍更高级的操作,熟悉企业开发。

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

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

相关文章

Java事件监听机制

这里写目录标题 先进行专栏介绍再插一句 开始喽事件监听机制分析观察者模式观察者模式由以下几个角色组成&#xff1a;观察者模式的工作流程如下&#xff1a;观察者模式的优点包括&#xff1a;观察者模式适用于以下场景&#xff1a;总结 事件监听机制的工作流程如下&#xff1a…

喆啡酒店十周年丨啡越时间限,ALL BY 10VE!

啡越时光热爱为伴 十年前&#xff0c;秉持对咖啡馆文化及复古风格的喜爱&#xff0c;喆啡酒店创造全新的Coffetel品类&#xff0c;将充满「温暖」「愉悦」「咖啡香」的格调体验带给消费者&#xff0c;成为无数人「旅途中的啡凡存在」。 十年间&#xff0c;喆啡酒店以热爱化为…

【深度学习】SMILEtrack: SiMIlarity LEarning for Multiple Object Tracking,论文

论文&#xff1a;https://arxiv.org/abs/2211.08824 代码&#xff1a;https://github.com/WWangYuHsiang/SMILEtrack 文章目录 AbstractIntroductionRelated WorkTracking-by-DetectionDetection methodData association method Tracking-by-Attention Methodology架构概述外观…

【vue3】基础知识点-setup语法糖

学习vue3&#xff0c;都会从基础知识点学起。了解setup函数&#xff0c;ref&#xff0c;recative&#xff0c;watch、comptued、pinia等如何使用 今天说vue3组合式api&#xff0c;setup函数 在学习过程中一开始接触到的是这样的&#xff0c;定义数据且都要通过return返回 <…

[保研/考研机试] KY102 计算表达式 上海交通大学复试上机题 C++实现

描述 对于一个不存在括号的表达式进行计算 输入描述&#xff1a; 存在多组数据&#xff0c;每组数据一行&#xff0c;表达式不存在空格 输出描述&#xff1a; 输出结果 示例1 输入&#xff1a; 6/233*4输出&#xff1a; 18思路&#xff1a; ①设立运算符和运算数两个…

Windows环境下通过 系统定时 执行脚本方式 压缩并备份文件夹 到其他数据盘

环境配置 压缩时需要使用7-zip进行调用&#xff0c;因此根据自己电脑进行安装 官网&#xff1a;https://www.7-zip.org/ 脚本文件 新建记事本文件&#xff0c;重命名为git_back_up.bat echo off rem 设置utf-8可以正常显示中文 chcp 65001 > nulrem 获取当前日期和时间&…

使用动态规划实现错排问题-2023年全国青少年信息素养大赛Python复赛真题精选

[导读]&#xff1a;超平老师计划推出《全国青少年信息素养大赛Python编程真题解析》50讲&#xff0c;这是超平老师解读Python编程挑战赛真题系列的第15讲。 全国青少年信息素养大赛&#xff08;原全国青少年电子信息智能创新大赛&#xff09;是“世界机器人大会青少年机器人设…

大数据Flink(五十七):Yarn集群环境(生产推荐)

文章目录 Yarn集群环境(生产推荐) 一、准备工作

Clickhouse 存储引擎

一、常用存储引擎分类 1.1 ReplacingMergeTree 这个引擎是在 MergeTree 的基础上&#xff0c;添加了”处理重复数据”的功能&#xff0c;该引擎和MergeTree的不同之处在于它会删除具有相同主键的重复项。 特点: 1使用ORDERBY排序键作为判断重复的唯一键 2.数据的去重只会在合并…

Openlayers实战:使几何图形适配窗口

Openlayers开发的项目中,有一种应用非常重要,就是绘制或者显示出几何图形后,让几何图形居中并适配到窗口下,这样能让用户很好的聚焦到所要看的内容中去。 这里使用了fit的这个view 的方法,具体的操作请参考示例源代码。 效果图 源代码 /* * @Author: 大剑师兰特(xiaozh…

apple pencil二代值不值得买?好用的苹果平替笔推荐

自从苹果的Pencil系列问世以来&#xff0c;在国内电容笔市场的销量大增&#xff0c;而苹果的Pencil系列&#xff0c;其的售价更是贵的让人望而却步。现在市面上有很多平替的电容笔&#xff0c;都能取代苹果的Pencil&#xff0c;用来做笔记、做批注、写写字都绰绰有余了。在这里…

【状态估计】一维粒子滤波研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

记录线上一次mysql只能查询,不能插入或更新的bug

错误复现 突然有一天产品通知xx服务不可用&#xff0c;想着最近也没有服务更新&#xff0c;就先排查一下服务日志 使用postman测试的时候请求明显超时&#xff0c;查看日志显示是一个锁的问题 使用工具连接到mysql&#xff0c;查看information_schema.INNODB_TRX,发现有一个事…

边写代码边学习之RNN

1. 什么是 RNN 循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;是一种以序列数据为输入来进行建模的深度学习模型&#xff0c;它是 NLP 中最常用的模型。其结构如下图&#xff1a; x是输入&#xff0c;h是隐层单元&#xff0c;o为输出&#xff…

Promise详细版

promise基础原理到难点分析 常见的Promise的方法解读 扩展async和await深入分析 逐步分析Promise底层逻辑代码 一、Promise基础 1.什么是promise 为了解决回调地狱&#xff1a; //2.设置点击事件btn.onclick function() {//3.创建ajax实例化对象let xhr new XMLHttpRe…

appium自动爬取数据

爬取类容&#xff1a;推荐知识点中所有的题目 爬取方式&#xff1a;appium模拟操作获取前端数据 入门级简单实现&#xff0c;针对题目和答案是文字内容的没有提取出来 适用场景;数据不多&#xff0c;参数加密&#xff0c;反爬严格等场景 from appium import webdriver impor…

策略模式——算法的封装与切换

1、简介 1.1、概述 在软件开发中&#xff0c;常常会遇到这种情况&#xff0c;实现某一个功能有多条途径。每一条途径对应一种算法&#xff0c;此时可以使用一种设计模式来实现灵活地选择解决途径&#xff0c;也能够方便地增加新的解决途径。为了适应算法灵活性而产生的设计模…

【工程优化问题】基于多种智能优化算法的压力容器设计问题研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【C# 基础精讲】循环语句:for、while、do-while

循环语句是C#编程中用于重复执行一段代码块的关键结构。C#支持for、while和do-while三种常见的循环语句&#xff0c;它们允许根据条件来控制代码块的重复执行。在本文中&#xff0c;我们将详细介绍这三种循环语句的语法和使用方法。 for循环 for循环是一种常见的循环结构&…

进程通信常见方式

目录 通信通信概述 通信的主要方式 进程同步机制--低级进程通信 高级通信工具 共享存储器系统(Shared-Memory System&#xff09; 管道(pipe)通信系统 客户机-服务器系统(Client-Server system)---套接字&#xff08;Socket&#xff09; 客户机-服务器系统(Client-Serv…