Elasticsearch
Elasticsearch
一.全文检索和Lucene
Lucene
基于java环境,基于Lucene之上包装一层外壳
Lucene是一个java的搜索引擎库,操作非常繁琐
全文检索
将搜索内容进行单词拆分,评分
比如搜索 “跑步运动员”
分词成跑步和运动员
对数据库里的标题进行评分(哪个标题里含有跑步或者运动员)
比如数据库的标题是以下几个
- 跑步运动员
- 跑步爱好者
- 运动员
肯定是1的评分最高 既有跑步还有运动员
倒排索引
排序哪个数据库里的标题含有分词最多,哪个排第一显示,也就是刚才所说的评分最高的标题
二. Elasticsearch应用场景
1.搜索: 电商,百科
2.高亮显示: github
3.分析和数据挖掘: ELk
三. Elasticsearch特点
1.高性能,分布式
2.对运维友好,不需要会java语言,开箱即用
3.功能丰富
四. Elasticsearch在电商搜索的实现
mysql:
skuid name
1 小米10s
2 华为荣耀
3 苹果11
ES:
将mysql中需要搜素的数据存储到ES中,进行分词。
聚合运算之后得到SKUID:
1
2
拿到ID之后,mysql就只需要简单地where查询即可
mysql:
select xx from xxx where skui=1
五. 第五章: ES安装启动
1.下载软件
mkdir /data/soft
[root@db-01 /data/soft]# ll -h
total 268M
-rw-r--r-- 1 root root 109M Feb 25 2019 elasticsearch-6.6.0.rpm
-rw-r--r-- 1 root root 159M Sep 2 16:35 jdk-8u102-linux-x64.rpm
2.安装jdk
rpm -ivh jdk-8u102-linux-x64.rpm
[root@db-01 /data/soft]# java -version
openjdk version "1.8.0_212"
OpenJDK Runtime Environment (build 1.8.0_212-b04)
OpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode)
3.安装ES
rpm -ivh elasticsearch-6.6.0.rpm
4.检查
systemctl start elasticsearch.service
es启动比较慢
netstat -lntup|grep 9200
systemctl status elasticsearch.service
[root@db-01 ~]# curl 127.0.0.1:9200
{
"name" : "Zr3WNj9",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "HR0ERydmTV2OH55subh7HQ",
"version" : {
"number" : "6.6.0",
"build_flavor" : "default",
"build_type" : "rpm",
"build_hash" : "a9861f4",
"build_date" : "2019-01-24T11:27:09.439740Z",
"build_snapshot" : false,
"lucene_version" : "7.6.0",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
六. ES配置
1.查看ES有哪些配置
[root@db-01 ~]# rpm -qc elasticsearch
/etc/elasticsearch/elasticsearch.yml #ES主配置文件
/etc/elasticsearch/jvm.options #jvm配置
/etc/init.d/elasticsearch #init的启动文件
/etc/sysconfig/elasticsearch #ES环境变量的相关配置
/usr/lib/sysctl.d/elasticsearch.conf #ES环境变量的相关配置
/usr/lib/systemd/system/elasticsearch.service #systemcd启动文件
2.自定义配置文件
[root@db-01 ~]# grep "^[a-Z]" /etc/elasticsearch/elasticsearch.yml
node.name: node-1 节点名称
path.data: /var/lib/elasticsearch 默认数据路径
path.logs: /var/log/elasticsearch 默认日志路径
bootstrap.memory_lock: true 开启内存锁定,需要配合KVM配置
network.host: 10.0.0.51,127.0.0.1 访问地址
http.port: 9200 端口
3.重启服务后发现报错
systemc restart elasticsearch
4.解决内存锁定失败:
查看日志发现提示内存锁定失败
tail -f /var/log/elasticsearch/elasticsearch.log
[2019-09-06T10:12:35,988][ERROR][o.e.b.Bootstrap ] [node-1] node validation exception
[1] bootstrap checks failed
[1]: memory locking requested for elasticsearch process but memory is not locked
解决方案:
编写elasticsearch子程序配置
systemctl edit elasticsearch
添加
[Service]
LimitMEMLOCK=infinity
重新读取服务文件和重启
systemctl daemon-reload
systemctl restart elasticsearch
七.ES与MySQL的关系对比
mysql和 ES对比
库 索引 index
表 类型 type
列 字段 Field
行 文档 Document
八.ES交互方式
三种交互方式
curl命令:
最繁琐
最复杂
最容易出错
不需要安装任何软件,只需要有curl命令
es-head插件:
查看数据方便
操作相对容易
需要node环境
kibana:
查看数据以及报表格式丰富
操作很简单
需要java环境和安装配置kibana
九. es-head插件安装
9.1注意:需要修改配置文件添加允许跨域参数(安全方面)
修改ES配置文件支持跨域
http.cors.enabled: true
http.cors.allow-origin: "*"
es-head 三种方式:
1.npm安装方式
- 需要nodejs环境
- 需要连接国外源
2.docker安装
3.google浏览器插件
- google商店下载插件
- 修改文件名为zip后缀
- 解压目录
- 打开google浏览器
- 拓展程序-开发者模式-打开已解压的目录
- 连接地址修改为ES的IP地址
9.4.具体的命令操作
Head插件在5.0以后安装方式发生了改变,需要nodejs环境支持,或者直接使用别人封装好的docker镜像
插件官方地址
https://github.com/mobz/elasticsearch-head
1).使用docker部署elasticsearch-head
docker pull alivv/elasticsearch-head
docker run --name es-head -p 9100:9100 -dit elivv/elasticsearch-head
2).使用nodejs编译安装elasticsearch-head
yum install nodejs npm openssl screen -y
node -v
npm -v
设置cnpm别名走指定的源
npm install -g cnpm --registry=https://registry.npm.taobao.org
cd /opt/
git clone git://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head/
cnpm install
创建会话
screen -S es-head
运行插件
cnpm run start
将会话放入后台
Ctrl+A+D
也可以直接使用npm,放在前台运行。
3).浏览器插件安装
image.png
image.png
十. kibana与ES交互
1.安装kibana
rpm -ivh kibana-6.6.0-x86_64.rpm
2.配置kibana
[root@db-01 /data/soft]# grep "^[a-Z]" /etc/kibana/kibana.yml
- 端口
server.port: 5601
- ip地址
server.host: "10.0.0.51"
- ES地址
elasticsearch.hosts: ["http://localhost:9200"]
- kibana将数据存到es里索引名字以.kibana结尾
kibana.index: ".kibana"
3.启动kibana
systemctl start kibana
4.操作ES
Dev Tools(kibana选项)
十一.操作语句
1. 创建索引
PUT index
2. 插入数据
直接插入数据会自动创建索引
1.使用自定义的ID
PUT haoge/info/1
{
"name": "haoge",
"age": "18"
}
2.使用随机ID
POST haoge/info/
{
"name": "haoge",
"age": "30",
"cha": "haoheng"
}
3 查询数据
1.简单查询
GET /haoge/_search
GET /haoge/info/1
2.单个条件查询
GET /haoge/_search
{
"query" : {
"term" : { "cha": "haoheng" }
}
}
3.多个条件查询
复杂 了解
GET /haoge/_search
{
"query" : {
"bool": {
"must": [
{"match": {"cha": "haoheng"}},
{"match": {"name": "haoge"}}
],
"filter": {
"range": {
"age": {
"gte": 27,
"lte": 30
}
}
}
}
}
}
}
4.查询方式
- curl命令
- es-head 基础查询 多个条件
- es-head 左侧字段查询
- kibana dev-tools 命令查询
- kibana management index patterns索引查询
4 更新数据
GET haoge/info/1
每个字段都要写
PUT haoge/info/1
{
"name": "zhang",
"age": "30"
}
5 删除数据
1.删除指定ID的数据
DELETE haoge/info/1
2.删除符合条件的数据
POST haoge/_delete_by_query
{
"query" : {
"match":{
"age":"29"
}
}
}
3.删除索引
DELETE haoge
4.!!!警告!!!
尽量不要在命令行或者Kibana里删除,因为没有任何警告
建议使用es-head删除(点击动作 删除)
生产环境可以先把索引关闭掉,如果一段时间没人访问了再删除(动作 关闭)
十二.ES集群
12.1 es-head界面解释
image.png集群相关名词
1.集群健康状态
绿色: 所有数据都完整,并且副本数满足
黄色: 所有数据都完整,但是有的索引副本数不满足
红色: 有的数据不完整
2.节点类型
主节点: 负责调度数据分配到哪个节点
数据节点: 负责处理落到自己身上的数据
默认: 主节点同时也是数据节点
3.数据分片
主分片: 实际存储的数据,负责读写,粗框的是主分片
副本分片: 主分片的副本,提供读,同步主分片,细框的是副本分片
4.副本:
主分片的备份,副本数量可以自定义
12.2 部署ES集群
1.安装java
rpm -ivh jdk-8u102-linux-x64.rpm
2.安装ES
rpm -ivh elasticsearch-6.6.0.rpm
3.配置ES配置文件
配置内存锁定:
systemctl edit elasticsearch.service
[Service]
LimitMEMLOCK=infinity
集群配置文件:
b01配置文件:
[root@db-01 ~]# cat /etc/elasticsearch/elasticsearch.yml
集群名字
cluster.name: linux4NB
节点名字
node.name: node-1
数据路径
path.data: /var/lib/elasticsearch
日志
path.logs: /var/log/elasticsearch
开启内存锁定
bootstrap.memory_lock: true
ip地址
network.host: 10.0.1.51,127.0.0.1
端口
http.port: 9200
集群内节点地址
discovery.zen.ping.unicast.hosts: ["10.0.1.51","10.0.2.52"]
主节点选举的最小数目计算方法{N(节点个数)/2+1},防止裂脑(下面解释)
discovery.zen.minimum_master_nodes: 1
跨域
http.cors.enabled: true
http.cors.allow-origin: ""
===============================================================
discovery.zen.minimum_master_nodes:
设置了最少有多少个备选主节点才能参加选举
比如5个节点那设置为3,如果有节点断开连接剩余节点小于3则不能参加选主,大于等于3则可以;按规定的计算方法算出的结果肯定是集群大部分的节点数量,所以不会出现有两两选主的情况,这样可以防止脑裂;但是节点尽量不要2台,因为2台设置是2 如果断开一台down了,剩下的一台肯定无法选主了,咱们是学习环境可以设置2台
==================================================================
db02配置文件:
[root@db-02 ~]# grep "^[a-Z]" /etc/elasticsearch/elasticsearch.yml
cluster.name: linux4NB
node.name: node-2
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 10.0.2.52,127.0.0.1
http.port: 9200
discovery.zen.ping.unicast.hosts: ["10.0.1.51","10.0.2.52"]
discovery.zen.minimum_master_nodes: 1
http.cors.enabled: true
http.cors.allow-origin: ""
4.启动
systemctl daemon-reload
systemctl restart elasticsearch
5.查看日志
tail -f /var/log/elasticsearch/linux.log
十三.ES集群相关注意
注意事项:
1.插入和读取数据在任意节点都可以执行,效果一样
2.es-head可以连接集群内任一台服务
3.主分片负责读写
主分片负责读写,副本分片负责读;写入主分片数据同时同步到副本分片
如果主分片所在的节点坏掉了,副本分片会升为主分片
4.主节点负责调度
如果主节点坏掉了,数据节点会自动升为主节点
13.1.查看集群各种信息
GET _cat/nodes
GET _cat/health
GET _cat/master
GET _cat/fielddata
GET _cat/indices
GET _cat/shards
GET _cat/shards/haoge
十四. 集群注意事项
注意1:发现节点参数不需要把集群内所有的机器IP都加上
只需要包含集群内任意一个IP和自己的IP就可以
discovery.zen.ping.unicast.hosts: ["10.0.0.51","10.0.0.53"]
注意2: 集群选举相关的参数需要设置为集群节点数的大多数
discovery.zen.minimum_master_nodes: 2
注意3: 默认创建索引为1副本5分片
注意4: 数据分配的时候会出现2中颜色
紫色: 正在迁移
黄色: 正在复制
绿色: 正常
注意5: 3节点的时候
0副本一台都不能坏
1副本的极限情况下可以坏2台: 1台1台的坏,不能同时坏2台(需要数据分配的时间)
2副本的情况可以同时坏2台
十五.自定义副本分片和索引
15.1注意:
索引一旦建立完成,分片数就不可以修改了
但是副本数可以随时修改
副本的多少跟分片的多少没有最佳,跟内存和CPU资源及数据量和访问量有关。
15.2命令
1.创建索引的时候就自定义副本和分片
PUT /yaya/
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 0
}
}
2.修改单个索引的副本数
PUT /oldzhang/_settings/
{
"settings": {
"number_of_replicas": 0
}
}
3.修改所有的索引的副本数
PUT /_all/_settings/
{
"settings": {
"number_of_replicas": 0
}
}
工作如何设置:
2个节点: 默认就可以
3个节点: 重要的数据,2副本 不重要的默认
日志收集: 1副本3分片
十六.监控
监控注意,不能只监控集群状态
1.监控节点数
2.监控集群状态
3.2者任意一个发生改变了都报警
监控命令:
GET _cat/nodes
GET _cat/health
16.1 增强插件x-pack监控功能
介绍
x-pack为elasticsearch,logstash,kibana提供了监控,报警,用户认证等功能,属于一个集成的插件。
6.x以前是以插件形式存在
6.x以后默认安装的时候就集成在软件包里了
monitoring-->点一下蓝色图标
image.png image.png image.png image.png
十七.ES优化
1.内存
ES设置的内存不要超过32G
即便你有足够的内存,也尽量不要超过32G,因为它浪费了内存,降低了CPU的性能,还要让GC应对大内存。
例:48内存
系统留一半: 24G
自己留一半: 24G
8G 12G 16G 24G 30G
ES分百分之五十,不要一下给到位逐步增加,不要超过32G。
2.磁盘
可以选用固态硬盘组建raid0,虽然安全性降低;但是我们的集群有副本集可以弥补这一点,一主两副可以同时坏掉两个节点数据也没问题。
十八.备份恢复
备份方式
1.快照备份(过于复杂)
2.elasticsearch-dump(主讲)
前提条件:
必须要有Node环境和npm软件
nodejs
npm
1.nodejs环境安装
https://nodejs.org/dist/v10.16.3/node-v10.16.3-linux-x64.tar.xz
tar xf node-v10.16.3-linux-x64.tar.xz -C /opt/node
vim /etc/profile
export PATH=/opt/node/bin:$PATH
source /etc/profile
[root@db-01 ~]# node -v
v10.16.3
[root@db-01 ~]# npm -v
6.9.0
2.指定使用国内淘宝npm源
npm install -g cnpm --registry=https://registry.npm.taobao.org
用cnpm命令就会走指定的淘宝源
3.安装es-dump
cnpm install elasticdump -g
4.备份命令
elasticdump \
--input=http://10.0.0.51:9200/haoge \
--output=/data/haoge.json \
--type=data
压缩
elasticdump \
--input=http://10.0.1.51:9200/haoge \
--output=$|gzip > /data/haoge.json.gz
5.恢复命令
elasticdump \
--input=/data/haoge.json \
--output=http://10.0.1.51:9200/haoge
6.注意
恢复的时候需要先解压缩成json格式
恢复的时候,如果已经存在相同的数据,会被覆盖掉
如果新增加的数据备份中没有,则不影响不覆盖,继续保留
十九.集群发现相关参数
异地机房,带宽较远可以设置此参数
discovery.zen.fd.ping_timeout: 120s
discovery.zen.fd.ping_retries: 6
discovery.zen.fd.ping_interval: 30s
超时时间为120s
重试次数为6次
每次间隔30秒
二十.中文分词
未分词的情况:
1.插入测试数据
curl -XPOST http://localhost:9200/index/_create/1 -H 'Content-Type:application/json' -d'
{"content":"美国留给伊拉克的是个烂摊子吗"}
'
curl -XPOST http://localhost:9200/index/_create/2 -H 'Content-Type:application/json' -d'
{"content":"公安部:各地校车将享最高路权"}
'
curl -XPOST http://localhost:9200/index/_create/3 -H 'Content-Type:application/json' -d'
{"content":"中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"}
'
curl -XPOST http://localhost:9200/index/_create/4 -H 'Content-Type:application/json' -d'
{"content":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"}
'
2.检测
curl -XPOST http://localhost:9200/index/_search -H 'Content-Type:application/json' -d'
{
"query" : { "match" : { "content" : "中国" }},
"highlight" : {
"pre_tags" : ["<tag1>", "<tag2>"],
"post_tags" : ["</tag1>", "</tag2>"],
"fields" : {
"content" : {}
}
}
}
'
将中国一词分开查询了“中”“国”含有一个的就会显示出来
分词配置
1.配置中文分词器
cd /usr/share/elasticsearch
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.6.0/elasticsearch-analysis-ik-6.6.0.zip
如果ik软件包在本地
./bin/elasticsearch-plugin install file:///data/elasticsearch-analysis-ik-6.6.0.zip
2.安装完成重启es
systemctl restart elasticsearch
3.创建索引
curl -XPUT http://localhost:9200/news
4.创建模板
curl -XPOST http://localhost:9200/news/text/_mapping -H 'Content-Type:application/json' -d'
{
"properties": {
"content": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_smart"
}
}
}'
5.插入测试数据
POST /news/text/1
{"content":"美国留给伊拉克的是个烂摊子吗"}
POST /news/text/2
{"content":"公安部:各地校车将享最高路权"}
POST /news/text/3
{"content":"中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"}
POST /news/text/4
{"content":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"}
6.再次查询数据发现已经能识别中文了
POST /news/_search
{
"query" : { "match" : { "content" : "中国" }},
"highlight" : {
"pre_tags" : ["<tag1>", "<tag2>"],
"post_tags" : ["</tag1>", "</tag2>"],
"fields" : {
"content" : {}
}
}
}
如果查询的中文不是词语,比如人名:刘华强、冯彪,可以自定在mian.doc文件中加上要查询的词语。但是需要重新更新一下数据才会生效。