Elasticsearch概述
什么是Elasticsearch
java有一套名为Lucene的API是搜索引擎的核心支持,Elasticsearch在Lucene的基础上开发出了一个功能全面的开箱即用的全文搜索引擎
类似的有Solr/MongoDB
为什么使用Elasticsearch
所有关系型数据库都有一个严重的性能缺陷
mysql\mariaDB\oracle\DB2等
就是前模糊的模糊查询不能使用索引
select * from spu where spu_name like '%鼠标%'
测试证明一张千万级别的数据库表进行模糊查询需要20秒以上
当今需求"三高"的需求下,不能接受这样的性能
我们使用ES来优化后同样的查询我们能将效率提高100倍
将大型的查询也能控制在毫秒级别
Elasticsearch查询原理
如果不使用ES让数据库查询,没有索引加持的模糊查询就是全表搜索性能差
但是Elasticsearch可以利用添加数据库完成对数据的分词倒排索引形成索引库
在查询时直接查询索引库,获得符合查询条件的数据信息
所谓索引其实就是数据库中数据的目录
目的是能够提高查询的效率
数据库索引分类
- 聚集索引
- 非聚集索引
所有关系型数据库都有一个缺陷,就是模糊查询时(查询条件前模糊),是不能利用索引进行查询的
一定会引起全表搜索,查询效率非常低
Elasticsearch的启动
官方下载链接
https://www.elastic.co/cn/downloads/past-releases#elasticsearch
双击elasticsearch.bat运行
运行之后可能看到下面界面
这个界面不能关闭,一旦关闭ES就停止了
我们启动ES双击这个bat文件即可,当然也可以设置Idea的shell script
验证ES是否在运行
浏览器输入地址:localhost:9200看到如下内容即可
mac系统启动
tar -xvf elasticsearch-7.6.2-darwin-x86_64.tar.gz
cd elasticsearch-7.6.2/bin
./elasticsearch
linux:
tar -xvf elasticsearch-7.6.2-linux-x86_64.tar.gz
cd elasticsearch-7.6.2/bin
./elasticsearch
ES基本使用
ES需要添加的依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
利用IDEA来测试ES
先创建一个HTTP Request文件 http client(http客户端)
GET http://localhost:9200
获得的结果和之前浏览器响应结果一致,表示当前http client文件正常运行
### 注释和分隔符,每次编写请求前,都要先编写3个#
GET http://localhost:9200
### ES分词测试 analyze(分析)
POST http://localhost:9200/_analyze
Content-Type: application/json
{
"text": "罗技激光无线游戏鼠标",
"analyzer": "standard"
}
详解:
我们代码中编写的"analyzer": "standard"是默认分词器
这个分词器只能对英文等西文字符(有空格的),进行分词
但是中文分词不能按空格分
我们使用开源的分词词库IK实现中文分词
安装插件之后要重启ES生效
ES启动之后,将中文分词器插件设置完成,在运行分词
{
"text": "罗技激光无线游戏鼠标",
"analyzer": "ik_smart"
}
再次运行分词测试,应该看到正常的中文分词效果
ik分词插件的使用
我们安装的ik实际上不只一个分词器
实际上除了ik_smart之外还有ik_max_word
实际上除了ik_smart之外还有ik_max_word
### ES分词测试 analyze(分析)
POST http://localhost:9200/_analyze
Content-Type: application/json
{
"text": "北京顺利举办了冬季奥林匹克运动会",
"analyzer": "ik_smart"
}
### ES分词测试 analyze(分析)
POST http://localhost:9200/_analyze
Content-Type: application/json
{
"text": "北京顺利举办了冬季奥林匹克运动会",
"analyzer": "ik_max_word"
}
上面的运行会有不同的分词效果
总体来说区别如下
ik_smart
- 优点:特征是粗略快速的将文字进行分词,占用空间小,查询速度快
- 缺点:分词的颗粒度大,可能跳过一些分词,导致查询结果不全面
ik_max_word
- 优点:特征是详细的文字片段进行分词,查询时查全率高,不容易遗漏数据
- 缺点:因为分词太过详细,导致有一些无用分词,占用空间较大,查询速度慢
使用ES操作数据
ES保存数据的结构
-
ES启动后,可以创建多个index(索引),index相当于数据库中表的概念
-
一个index可以创建保存多个document(文档),一个document相当于表中的一行数据
-
一个document中可以有多个属性和对应的值,相当于一行数据中字段和字段的值
项目node文件夹下共享了ES文档,命令都在里面,可以测试
…(img-6pYVmvgW-1656428090720)]
-
ES启动后,可以创建多个index(索引),index相当于数据库中表的概念
-
一个index可以创建保存多个document(文档),一个document相当于表中的一行数据
-
一个document中可以有多个属性和对应的值,相当于一行数据中字段和字段的值
项目node文件夹下共享了ES文档,命令都在里面,可以测试
可以通过Spring Data来连接ES