- 要理解倒排索引
- 要能够使用DSL命令操作索引库
- 要能够使用DSL命令操作文档
- 要能够使用RestAPI操作索引库、文档
一、ES简介
- 理解倒排索引的概念和作用
- 理解es和MySql的区别和使用场景
1. 数据库查询的问题
假如我们有一个电商系统,需要查询商品。以前一直是直接从MySql数据库里用SQL语句模糊查询,例如:
select * from tb_product where pname like '%华为手机%'
但是这种查询检索数据的方式,有很大的问题:
查询性能很低
MySql可以通过索引的方式来提高查询的效率,但是像上边这种模糊查询以%开头,会导致索引失效,实际上执行的是全表扫描,效率非常低。
查询结果不准确
我们应当查询到与“手机”、“华为”等词条相关的所有商品,而不是 只包含“华为手机”的商品
而这些问题,都可以使用ElasticSearch轻易的解决掉:把数据存储到ElasticSearch里,由ElasticSearch提供高效的文档检索能力
2. ES简介
2.1 ElasticSearch简介
ElasticSearch,简称ES。
ES是:一款非常强大的开源搜索引擎,可以帮助我们从海量数据中快速找到需要的内容。
如:百度搜索、京东商品搜索、打车软件中搜附近的车辆等等。
ES结合kibana、Logstash、Beats(也就是ELK技术栈,Elastic Stack),
被广泛的用户在日志数据分析、实时监控等领域。
ES是:ELK的核心,负责存储、搜索、分析数据。
![]()
2.2 ElasticSearch发展
Doug Cutting于1999年研发了一个Java语言的搜索引擎类库(函数库):Lucene,目前已是Apache的顶级项目。
官网地址:Apache Lucene - Welcome to Apache Lucene
Lucene优势:易扩展、高性能(基于倒排索引)
Lucene缺点:只限于Java语言、学习曲线陡峭、不支持水平扩展
2004年Shay Banon基于Lucene开发了Compass,随后于2010年重写了Compass,取名为ElasticSearch。
官网地址:欢迎来到 Elastic — Elasticsearch 和 Kibana 的开发者 | Elastic
相比于Lucene,ElasticSearch具备更多优势:
支持分布式,可水平扩展
提供RESTful接口,任何编程语言都可以使用。
到目前为止,ElasticSearch已经成为主流的搜索引擎
3. 倒排索引
3.0 索引介绍
索引:索引是一种数组结构,可以帮助我们快速查找数据,提升查询的速度。类似于字典的目录
如果没有目录:想要查找一项数据,就需要全表扫描,速度非常慢
可以构造目录:
根据拼音构造了目录:想要查找一个字,就可以根据拼音,从拼音目录里快速找到这个字在哪一页
直接到这一页,获取这个字的详细信息了
根据笔画构造了目录:想要查找一个字,就可以根据笔画,从笔画目录里快速找到这个字在哪一页
直接到这一页,获取这个字的详细信息了
根据偏旁构造了目录:想要查找一个字,就可以根据偏旁,从偏旁目录里快速找到这个字在哪一页
直接到这一页,获取这个字的详细信息了
在数据库里:
如果没有索引:想要查找一条数据,就需要全表扫描,速度非常慢
可以构造索引:
根据主键id构造索引:想要查找id为1的数据,直接去索引里找到id对应的数据在磁盘上哪个地址
直接跳转到这个地址,获取这条数据的详细信息
根据用户名构造索引:想要查找“张三”数据,直接去用户名索引里找到数据对应的地址
直接到这个地址,获取这条数据的详细信息
索引的特点:
可以极大的提升查询速度
但是会影响增删改的速度
3.1 正向索引
说明
传统RDBMS(例如MySql)采用的是正向索引,
即:根据表的主键字段构建索引,在查询时要扫描到每个索引值对应的数据,
从中筛选出符合查询条件的记录。
这样的检索方式构建索引简单,但是不适合复杂的文档检索。
复杂的文档检索时,索引会失效,变成全表扫描
示例
以商品表搜索为例,商品表tb_product如下:
id title price 1 小米手机 3499 2 华为手机 4999 3 华为小米手机充电器 49 4 小米手环 79 要搜索包含“手机”的商品,执行SQL:select * from tb_product where title like '%手机%'
MySql会扫描所有的数据记录,逐条判断 “title”的值是否包含“手机”,直到全表扫描,过滤出所有符合要求的结果
3.2 倒排索引
说明
ElasticSearch采用的是:倒排索引
即:以字或词为关键字构建索引,保存每个关键字所在的记录。
当需要查询时,根据词条匹配查询条件,直接找到关联的记录。
倒排索引的建立和维护都比较复杂,但是在查询时可以和查询关键字关联的所有结果,并快速响应。
示例
以商品表搜索为例,商品表略
构建倒排索引
词条(term) 文档id 小米 1, 3, 4 手机 1, 2 华为 2, 3 充电器 3 手环 4 文档Document:每条数据就是一个文档
词条term:按照语义分成的词语
当搜索“华为手机”时:
把搜索条件进行分词,得到两个词条:“华为”, “手机”
根据词条,去倒排索引里查询相关的文档id,得到:
“华为”:2, 3
“手机”:1, 2
根据文档id,找到对应的文档数据,得到:id为1、2、3的文档
4. ES和MySql
使用方式
传统的RDBMS和ElasticSearch各有所长:
RDBMS是 Relational Database Management System 的缩写,
中文译为“关系数据库管理系统”
它是 SQL 语言以及所有现代数据库系统(例如 SQL Server、DB2、Oracle、MySQL 和 Microsoft Access)的基础。
关系数据库管理系统(RDBMS)是一种基于 E. F. Codd 发明的关系模型的数据库管理系统(DBMS)。
MySQL:擅长事务类操作,可以确保数据的一致性和安全性
ES:擅长海量数据的搜索、分析、计算
在实际开发中,通常是结合使用
MySQL负责写操作
ES负责搜索操作
![]()
5. 小结
正向索引:先找到数据,再判断数据是否符合条件。需要全表扫描,速度慢
倒排索引:根据词条去倒排索引里找文档id,直接找到数据。不需要全表扫描,速度极快
1. ES会对数据表里的某些字段构建倒排索引
对这个字段的值,进行拆词(分词),得到词条
构建出来 每个词条 与 文档id的对应关系
这个对应关系,就是倒排索引
2. 在搜索数据时,提供搜索词
ES会对搜索词进行拆词(分词)得到词条
去倒排索引里,直接找到关联的文档id,获取id对应的数据
ES和MySQL的使用方式
有查询操作,找ES
有增删改操作,找MySQL
然后MySQL和ES之间要实现数据同步
二、安装ES
掌握
- 安装es7.4,安装kibana
- 安装ik分词器
- 理解ik分词器的分类和作用
1. 安装ES
目前我们安装的是ES的7.4.0版本,需要JDK8及以上
1.1 解压
把《elasticsearch-7.4.0-windows-x86_64.zip》解压到一个不含中文、空格、特殊字符的目录里
1.2 配置
1) 配置存储路径
打开config/elasticsearch.yml文件,设置索引数据的存储路径,和日志的存储路径
2) 配置虚拟机参数
进入es的bin目录,直接双击 elasticsearch.bat即可启动
es服务要占用两个端口:
9200:rest访问接口,我们稍后要通过这个端口连接es、操作es
9300:用于es集群间通信的接口
1.3 验证
在浏览器上直接输入地址 http://localhost:9200/, 如果看到以下界面,说明es启动成功了
2. 安装Kibana
Kibana是一个ES索引库数据统计工具,可以利用ES的聚合功能,生成各种图表,如柱形图,线状图,饼图等。
而且还提供了操作ES索引数据的控制台,并且提供了一定的API提示,非常有利于我们学习ES的语法。
2.1 安装nodeJs
Kibana依赖于nodeJs,需要在windows下先安装Node.js,然后才能安装Kibana。
双击nodejs的安装包,按照提示一步步安装即可
安装成功后,打开cmd 输入:
node -v
,如果能看到版本号,说明node安装成功
2.2 安装Kibana
1) 解压
把《kibana-7.4.0-windows-x86_64.zip》解压到不含中文、空格、特殊字符的目录里
2) 配置
修改kibana的config/kibana.yml