一、ElasticSearch的倒排索引
1.1、数据库存在的问题
问题1: 查询title中包含”手机”的信息
SELECT * FROM goods WHERE title LIKE '%手机%'
使用模糊搜索,左边有通配符,不会走索引,会全表扫描,性能低
问题2:查询title中包含”我要买一部华为手机”的信息
SELECT * FROM goods WHERE title LIKE '%我要买一部华为手机%'
关系型数据库提供的查询,功能太弱
1.2、倒排索引
了解倒排索引的存储原理
使用新华字典查找汉字,先找到汉字的偏旁部首,再根据偏旁部首对应的目录(索引)找到目标汉字
ES样例
- 文档0(编号0):we like java java java
- 文档1(编号1):we like lucene lucene lucene
建立倒排索引的流程
首先对所有数据的内容进行拆分(分词),拆分成唯一的一个词语(词条Term)
然后建立词条和每条数据的对应关系(词条在文档出现的位置下标,出现频率),如下所示
(Term 词条) (Doc ID,Freq 频率) (Pos 位置) we (0,1) (1,1) (0,0)(1,0) like (0,1) (1,1) (0,1)(1,1) java (0,3) (2,3,4) lucene (1,3) (2,3,4)
小结
- 倒排索引:将每条数据中的内容进行分词,形成词条。然后记录词条和数据的唯一标识(id)的对应关系,形成的产物
二、ElasticSearch存储和搜索原理
理解ElasticSearch存储和搜索原理
- 假设数据存在以下几条数据
- ES中存储以及搜索原理图如下所示
- 说明
- ES的数据库我们称其为 index (索引库),每条数据我们称之为 document (文档),ES在存储文档的时候,会对它需要分词的字段内容进行切分,切分成一个个词条,再建立每个词条与文档唯一标识(id)的对应关系,即倒排索引
- 说明
- 我们再回过头看之间数据库存在的两个问题,通过ES是否能够解决
- 问题1
- 性能低:使用模糊查询,左边有通配符,不会走索引,会全表扫描,性能低
- ES解决方案:如果使用”手机”作为关键字查询,ES生成的倒排索引中,词条会排序,形成一颗树形结构,提升词条的查询速度
- 问题2
- 功能弱:如果以”华为手机” 作为条件,查询不出来数据
- ES解决方案:如果使用”华为手机”作为关键字查询,ES也可以对搜索的关键字进行分词,比如将华为手机拆分成”华为”、”手机”,然后根据两个词分词去倒排索引中进行查询,然后取结果的并集
- 问题1
三、ElasticSearch相关概念
理解ElasticSearch和关系型数据库的区别以及分工
3.1、介绍
- ElasticSearch是Java语言开发的,并作为Apache许可条款下的开放源码发布,基于Lucene实现,是一款分布式、高扩展、近实时的搜索服务,可以基于RESTful web接口进行操作
- 官网:https://www.elastic.co/
- 基于Lucene的产品
- Slor:实时性偏弱,在高并发地写入数据时,Slor需要频繁地构建索引库,而索引库构建影响到查询性能
- Elasticsearch:实时性非常强(近实时),ES在频繁地构建索引库的同时,不太影响查询的性能
3.2、应用场景
- 海量数据的查询(京东,淘宝商品搜素)
- 日志数据分析(ELK ElasticSearch + Logstach + Kibana 搭建日志监控平台)
- 实时数据分析
3.3、ElasticSearch和MySQL的区别
我们可以把传统关系型数据库MySQL和ElasticSearch进行一下对比
MySQL Elasticsearch 说明 Database Index 索引(index),就是文档的集合,类似数据库(Database) Table Type 类型(Type),就是文档的类型,相当于数据库中的表(Table) Row Document 文档(Document),就是一条条的数据,类似数据库中的行(Row),文档都是JSON格式 Column Field 字段(Field),就是JSON文档中的字段,类似数据库中的列(Column) Schema Mapping Mapping(映射)是索引中文档的约束,例如字段类型约束。类似数据库的表结构(Schema) index Everything is indexed es对存储的所有数据都进行分词建立索引 SQL DSL(Domain Specification Lanuage)
不难发现,两者均有其优势
- MySQL:擅长事务类型操作,可以确保数据的安全和一致性,进行复杂的多表查询
- ElasticSearch:擅长海量数据的搜索、分析、计算
因此在企业中,往往是两者结合使用
- 对安全性要求较高的写操作,关系复杂的表需求,使用MySQL实现
- 对查询性能要求较高的搜索需求,使用Elasticsearch实现
- 两者再基于某种方式,实现数据的同步,保证数据一致性
3.4、小结
- 数据库查询存在的问题
- 性能低
- 功能较弱
- 倒排索引
- 将文档中字段的内容进行分词,形成词条和每条数据id的对应关系
- Elasticsearch概念以及作用
- 搜索服务器
- 高性能、功能强大
- 不是替换MySQL,es做搜索,MySQL做数据存储
- 索引库(index)= 数据库
- 类型(type)= 表
- 映射(mapping)= 表结构
- 文档(document)= 一行数据
- 映射参数(field)= 表字段
四、ElasticSearch的安装
4.1、下载镜像
- 命令
docker pull elasticsearch:7.4.1
- 如下所示
- Windows下载很简单,去官网下载,解压后启动即可使用
4.2、启动容器
命令
docker run -di --name=elasticsearch -p 9200:9200 -v /root/elasticsearch/plugins:/usr/share/elasticsearch/plugins -e "discovery.type=single-node" elasticsearch:7.4.1
端口映射:9200
文件夹映射:
/usr/share/elasticsearch/plugins
添加环境变量,名为
discovery.type=single-node
PS:可以暂时不用理解为什么映射这个文件夹,以及后面的
"discovery.type=single-node"
如下所示
4.3、浏览器访问
浏览器输入:http:宿主机IP:9200
如果发现启动失败问题(内存分配原因),可以参考下面这个链接
日常踩坑之elasticsearch docker 无法启动问题_不懂1417的博客-CSDN博客_docker无法启动elasticsearch]
也可以参考这个命令
sysctl -w vm.max_map_count=262144 docker run -di --name=elasticsearch -p 9200:9200 -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" -e "discovery.type=single-node" -v /root/elasticsearch/plugins:/usr/share/elasticsearch/plugins -v /root/elasticsearch/data:/usr/share/elasticsearch/data elasticsearch:7.4.1
主要看
ES_JAVA_OPTS=-Xms512m -Xmx512m
如果报错信息为:
java.nio.file.AccessDeniedException: /usr/share/elasticsearch/data/nodes
,可以参考以下的博客
如何查看报错信息
docker logs 容器id
- 可以根据报错信息自行百度查看,一般都会有解决办法
PS:如果访问不了,记得开放端口或者关闭防火墙
- 开放端口如下所示
五、Kibana的安装
kibana是elasticsearch的页面可视化工具,类似MySQL的SQLyog等可视化工具
5.1、拉取镜像
- 命令
docker pull kibana:7.4.1
- 如下所示
5.2、创建容器
命令
docker run -id -p 5601:5601 --link elasticsearch --name=kibana -e "ELASTICSEARCH_URL=http://你的自己的ip地址:9200" kibana:7.4.0
如下所示
5.3、浏览器访问
- 浏览器访问:http://宿主机IP地址/5601
原创文章,作者:6024010,如若转载,请注明出处:https://blog.ytso.com/275985.html