1基础概念
1.1基础
1:使用关系型数据库性能上满足不了要求。比如去商品表中查询带有手机的商品。由于模糊查询左边加了通配符%,导致索引无效。索引无效代表数据需要一条条去匹配。导致性能极差( 使用模糊查询,左边有通配符,不会走索引,会全表扫描,性能低) =》关系型数据库性能低
SELECT * FROM goods WHERE title LIKE ' %手机%' ;
2:搜索关键词 比如【华为手机】,此时数据库只能搜到【华为手机】的数据,搜索不到仅仅是【华为】/【手机】的数据(可以参考去淘宝、京东等地方搜索结果:最前面是【华为手机】、后面数据则只包含【华为】/【手机】的数据) =》关系型数据库功能弱
1.2拓展
1:倒排索引
倒排索引:将各个文档中的内容,进行分词,形成词条。然后记录词条和数据的唯一标识(id) 的对应关系,形成的产物。
例如:”床前明月光”--> 分词。反向(倒排)索引:
1.3ElasticSearch数据的存储和搜索原理
分为两个部分:索引和文档。
例如下图:将文档中数据(json格式)id作为value,title中数字进行拆解作为term,每次搜索先找到term(会按照顺序一一条条往下找,找到之后就不会往下找了【关系型数据库一般都是全表扫描,所以这个币关系型数据库快】),然后再通过term找到文档(document)数据中的id,通过id找到数据
ElasticSearch创建便会建立一个排序;生成的倒排索引中,词条会排序,形成-颗树形结构,提升词条的查询速度。
Demo:使用“华为手机”作为关键字查询,如果没有【华为手机】,ElasticSearch则会将这个关键词自动拆分成两个部分(term)华为(value=1、3)、手机 (value=1、2、3)然后再取它们交集或者并集
1.4ElasticSearch概念
- ElasticSearch是一个基于Lucene的搜索服务器
- 是一个分布式、高扩展、高实时的搜索与数据分析引擎
- 基于RESTful web接口
- Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引|擎
- 应用场景
- 搜索:海量数据的查询
- 日志数据分析
- 实时数据分析
- MySQL有事务性而ElasticSearch没有事务性所以你删了的数据是无法恢复的。
- ElasticSearch没有物理外键这个特性,,如果你的数据强一致性要求比较高,还是建议慎用
- ElasticSearch和MySq|分工不同,MySQL负责存储数据,ElasticSearch负责搜索数据。
1.5核心概念
索引(index):ElasticSearch存储数据的地方,可以理解成关系型数据库中的数据库概念。
映射(mapping):mapping定义了每个字段的类型、字段所使用的分词器等。相当于关系型数据库中的表结构。
文档(document):Elasticsearch中的最小数据单元,常以json格式显示。- -个document相当于关系型数据库中的一行数据。
倒排索引:一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,对应一个包含它的文档id列表。
类型(type)
一种type就像一类表。如用户表、角色表等。在Elaticsearch7.X默认type为 _doc
- ES 5.x中一 个index可以有多种type.
- ES 6.x中一个index只能有一种type。
- ES 7.x以后,将逐步移除type这个概念,现在的操作经不再使用,默认_doc
1.6安装ElasticSearch
- 首先去官网下载安装包,下载之后移到服务器上面,这里我放置在/opt/es下面
- 因为安全问题,Elasticsearch 不允许root用户直接运行,所以要创建新用户,在root用户中创建新用户,执行如下命令(bin文件夹下执行):
- useradd itqy # 新增itqy 用户
- passwd itqy #为itqy 用户设置密码
-
然后记得把elasticsearch授权给新创建的用户【chown -R itqy:itqy elasticsearch-7.13.1/】
- 新创建的itqy用户最大可创建文件数太小,最大虚拟内存太小,切换到root用户,编辑下列配置文件,添加类似如下内容
-
#切换到root用户 su r oot #1. ===最大可创建文件数太小====== vim /etc/security/limits.conf #在文件末尾中增加下面内容 itqy soft nofile 65536 itqy hard nofile 65536 # ===== vim /etc/security/limits.d/20-nproc.conf #在文件末尾中增加下面内容 itqy soft nofile 65536 itqy hard nofile 65536 * hard nproc 4096 #注:*代表Linux所有用户名称 #2. ===最大虛拟内存太小====== vim /etc/sysctl.conf #在文件中增加下面内容 vm.max_map_count=655360 #重新加载,输入下面命令: sysctl -p
-
输入sysctl -p 之后可以看见之前配置的vm.max_map_count=655360
-
-
ElasticSearch结构
- 配置config下的elasticsearch.yml 在最末尾添加以下配置
-
cluster.name: my-application node.name: node-1 network.host: 0.0.0.0 http port: 9200 cluster.initial_master_nodes: ["node-1"] #cluster.name:配置elasticsearch的集群名称, 默认是elasticsearch。 建议修改成有具体含义名称 #node.name:节点名, elasticsearch会默认随机指定一个名字, 建议指定一个有意义的名称, 方便管理 #network.host:设置为0.0.0.0允许外网访问 #http.port: Elasticsearch的http访问端口 #cluster.initial_ master. nodes:初始化新的集群时需要此配置来选举master
-
- 启动ElasticSearch:进入bin文件夹下 ./elasticsearch
-
最后访问地址
-
先在服务器*问:【 curl -XGET http://111.230.182.125:9200/ 】
-
1.7Kibana安装
Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索、查看交互存储在Elasticsearch索引中的数据。使用Kibana,可以通过各种图表进行高级数据分析及展示。
Kibana让海量数据更容易理解。它操作简单,基于浏览器的用户界面可以快速创建仪表板(dashboard) 实时显示Elasticsearch查询动态。下载的版本必须和ElasticSearch版本一致
- 首先将文件移动到linux上面,并且解压: tar -zxvf 文件名称
- 修改 config/kibana. yml最末尾添加 参数
-
server.port: 5601 server.host: "0.0.0.0" server.name: "kibana-itcast" elasticsearch.hosts: ["http://127.0.0.1:9200"] elasticsearch.requestTimeout: 99999 #server.port: http访问端口 #server.host: ip地址, 0.0.0.0表示可远程访问 #server.name: kibana服务名 #elasticsearch.hosts: elasticsearch地址 #elasticsearch.requestTimeout:请求elasticsearch超时时间,默认为30000,此处可根据情况设置
- 然后进入bin文件夹下启动[不推荐root启动]
- ./kibana --allow-root (kibana不推荐root启动,如果强行 则需要后面加上 --allow-root)
- 出现这个就说明成功
- 启动kibana
-
chown -R itqy:itqy kibana-7.13.1-linux-x86_64 su itqy cd kibana-7.13.1-linux-x86_64/bin ./kibana
-
8ElasticSearch常见错
- Caused by: java.lang.RuntimeException: can not run elasticsearch as root
- Elasticsearch不能用root账号运行,必须新创建一个账号
- java.nio.file.AccessDeniedException: /usr/share/
- 当前账号没有权限
- 先给当前账号授权【chown -R itqy:itqy elasticsearch-7.13.1/】
- 然后输入:chmod 777 /opt/es/elasticsearch-7.13.1
- Caused by: java.lang.RuntimeException: can not run elasticsearch as root