Elasticsearch

Elasticsearch应用场景

1.搜索: 电商,百科
2.高亮显示: github
3.分析和数据挖掘: ELk

Elasticsearch特点

1.高性能,分布式
2.对运维友好,不需要会java语言,开箱即用
3.功能丰富

Elasticsearch在电商搜索的实现

mysql:
skuid name
1 狗粮100kg
2 猫粮50kg
3 猫罐头200g

ES:

聚合运算之后得到SKUID:
1
2
拿到ID之后,mysql就只需要简单地where查询即可
mysql:
select xx from xxx where skuid 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
java -version

3.安装ES
rpm -ivh elasticsearch-6.6.0.rpm

4.检查
systemctl daemon-reload
systemctl enable elasticsearch.service
systemctl start elasticsearch.service
systemctl status elasticsearch.service
netstat -lntup|grep 9200

[root@db-01 ~]# curl 127.0.0.1:9200
{
"name" : "d6F9LYu",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "tDNMEvCXSj-rEy3jTBdAeQ",
"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@db01 ~]# rpm -qc elasticsearch
/etc/elasticsearch/elasticsearch.yml #主配置文件
/etc/elasticsearch/jvm.options #JVM虚拟机配置
/etc/init.d/elasticsearch #init启动文件
/etc/sysconfig/elasticsearch #环境变量相关配置
/usr/lib/sysctl.d/elasticsearch.conf #环境变量相关配置
/usr/lib/systemd/system/elasticsearch.service #systemc启动文件

2.自定义配置文件
[root@db01 ~]# 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
network.host: 10.0.0.51,127.0.0.1
http.port: 9200

3.重启服务后发现报错
systemctl restart elasticsearch

4.解决内存锁定失败:
查看日志发现提示内存锁定失败
tail -f /var/log/elasticsearch/elasticsearch.log
[2019-12-04T10:27:42,136][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

解决方案:
systemctl edit elasticsearch
[Service]
LimitMEMLOCK=infinity
systemctl daemon-reload
systemctl restart elasticsearch

官方解决方案
https://www.elastic.co/guide/en/elasticsearch/reference/6.6/_memory_lock_check.html
https://www.elastic.co/guide/en/elasticsearch/reference/6.6/_memory_lock_check.html
https://www.elastic.co/guide/en/elasticsearch/reference/6.6/setting-system-settings.html#systemd

ES交互方式

三种交互方式
curl命令:
最繁琐
最复杂
最容易出错
不需要安装任何软件,只需要有curl命令

es-head插件:
查看数据方便
操作相对容易
需要node环境

kibana:
查看数据以及报表格式丰富
操作很简单
需要java环境和安装配置kibana

es-head插件安装

注意:需要修改配置文件添加允许跨域参数
修改ES配置文件支持跨域
http.cors.enabled: true
http.cors.allow-origin: "*"

es-head 三种方式:
1.npm安装方式

  • 需要nodejs环境
  • 需要连接国外源

2.docker安装

3.google浏览器插件

  • 修改文件名为zip后缀
  • 解压目录
  • 拓展程序-开发者模式-打开已解压的目录
  • 连接地址修改为ES的IP地址

4.具体操作命令

Head插件在5.0以后安装方式发生了改变,需要nodejs环境支持,或者直接使用别人封装好的docker镜像
插件官方地址
https://github.com/mobz/elasticsearch-head

使用docker部署elasticsearch-head
docker pull alivv/elasticsearch-head
docker run --name es-head -p 9100:9100 -dit elivv/elasticsearch-head
=================================================

使用nodejs编译安装elasticsearch-head
cd /opt/
wget https://nodejs.org/dist/v12.13.0/node-v12.13.0-linux-x64.tar.xz
tar xf node-v12.13.0-linux-x64.tar.xz
ln -s node-v12.13.0-linux-x64 node
echo "export PATH=/opt/node/bin:$PATH" >> /etc/profile
source /etc/profile
npm -v
node -v
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
cnpm run start

修改ES配置文件支持跨域
http.cors.enabled: true
http.cors.allow-origin: "*"

kibana与ES交互

1.安装kibana
rpm -ivh kibana-6.6.0-x86_64.rpm

2.配置kibana
[root@db01 ~]# egrep "^[a-Z]" /etc/kibana/kibana.yml
server.port: 5601
server.host: "10.0.0.51"
elasticsearch.hosts: ["http://localhost:9200"]
kibana.index: ".kibana"

3.启动kibana
systemctl start kibana

4.操作ES
Dev Tools

关键词:
1.Lucene
2.java
3.全文检索
4.倒排索引

kibana测试语句

PUT oldzhang/info/1
{
"name": "zhang",
"age": "29"
}

POST oldzhang/info/
{
"name": "zhang",
"age": "29",
"pet": "xiaoqi"
}

POST oldzhang/info/
{
"name": "zhang",
"age": "29",
"pet": "xiaoqi",
"id": "1"
}

POST oldzhang/info/
{
"name": "yazhang",
"age": "30",
"pet": "xiao8",
"id": "2"
}

POST oldzhang/info/
{
"name": "ya",
"age": "29",
"pet": "xiao9",
"id": "3"
}

POST oldzhang/info/
{
"name": "ya",
"age": "35",
"pet": "xiao10",
"id": "3"
}

GET oldzhang/_search/
{
"query": {
"bool": {
"must": [
{
"range": {
"age.keyword": {
"gt": "28",
"lt": "30"
}
}
},
{
"term": {
"name.keyword": "zhang"
}
},
{
"range": {
"id.keyword": {
"gt": "0",
"lt": "3"
}
}
}
],
"must_not": [],
"should": []
}
},
"from": 0,
"size": 10,
"sort": [],
"aggs": {}
}

es简单增删改查语句

第一章: 创建索引
PUT index

第二章: 插入数据
1.使用自定义的ID
PUT oldzhang/info/1
{
"name": "zhang",
"age": "29"
}

2.使用随机ID
POST oldzhang/info/
{
"name": "zhang",
"age": "29",
"pet": "xiaoqi"
}

第三章: 查询数据
1.简单查询
GET /oldzhang/_search
GET /oldzhang/_search/1

2.单个条件查询
GET /oldzhang/_search
{
"query" : {
"term" : { "job" : "it" }
}
}

3.多个条件查询
GET /oldzhang/_search
{
"query" : {
"bool": {
"must": [
{"match": {"pet": "xiao10"}},
{"match": {"name": "ya"}}
],
"filter": {
"range": {
"age": {
"gte": 27,
"lte": 30
}
}
}
}
}
}
}

4.查询方式

  • curl命令
  • es-head 基础查询多个条件
  • es-head 左侧字段查询
  • kibana dev-tools 命令查询
  • kibana 索引查询

第四章: 更新数据
GET oldzhang/info/1

PUT oldzhang/info/1
{
"name": "zhang",
"age": "30",
"job": "it"
}

POST oldzhang/info/1
{
"name": "zhang",
"age": "30",
"job": "it"
}

第五章: 删除数据
1.删除指定ID的数据
DELETE oldzhang/info/1

2.删除符合条件的数据
POST oldzhang/_delete_by_query
{
"query" : {
"match":{
"age":"29"
}
}
}

3.删除索引
DELETE oldzhang

4.!!!警告!!!
尽量不要在命令行或者Kibana里删除,因为没有任何警告
建议使用es-head删除
生产环境可以先把索引关闭掉,如果一段时间没人访问了再删除

集群相关名词

1.集群健康状态
绿色: 所有数据都完整,并且副本数满足
黄色: 所有数据都完整,但是有的索引副本数不满足
红色: 有的索引数据不完整

默认创建索引:
5分片
1副本

2.节点类型
主节点: 负责调度数据分配到哪个节点
数据节点: 负责处理落到自己身上的请求
默认: 主节点同时也是数据节点

3.数据分片
主分片: 实际存储的数据,负责读写,粗框的是主分片
副本分片: 主分片的副本,提供读,同步主分片,细框的是副本分片

4.副本:
主分片的备份,副本数量可以自定义

5.修改分片和副本的限定条件

  • 索引创建的时候可以指定分片数和副本数
  • 索引一旦创建成功,分片数就不能修改了,但是可以调整副本数

部署ES集群

0.从db01拉取数据
mkdir /data/soft
cd /data/soft
rsync -avz 10.0.0.51:/data/soft/* .

1.安装java
rpm -ivh jdk-8u102-linux-x64.rpm

2.安装ES
rpm -ivh elasticsearch-6.6.0.rpm

3.配置ES配置文件
配置内存锁定:
yum remove nano
systemctl edit elasticsearch.service
[Service]
LimitMEMLOCK=infinity
systemctl daemon-reload

集群配置文件:
b01配置文件:
cluster.name: linuxNB
node.name: node-1
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 10.0.0.51,127.0.0.1
http.port: 9200
discovery.zen.ping.unicast.hosts: ["10.0.0.51", "10.0.0.52"]
discovery.zen.minimum_master_nodes: 1
==================================================================
db02配置文件:
cluster.name: linuxNB
node.name: node-2
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 10.0.0.52,127.0.0.1
http.port: 9200
discovery.zen.ping.unicast.hosts: ["10.0.0.51", "10.0.0.52"]
discovery.zen.minimum_master_nodes: 1

4.2台机器都重新启动es
systemctl restart elasticsearch.service

5.查看日志
tail -f /var/log/elasticsearch/linuxNB.log

ES集群相关注意

注意事项:
1.插入和读取数据在任意节点都可以执行,效果一样
2.es-head可以连接集群内任一台服务

3.主节点负责读写
如果主分片所在的节点坏掉了,副本分片会升为主分片

4.主节点负责调度
如果主节点坏掉了,数据节点会自动升为主节点

第九章: 查看集群各种信息
GET _cat/nodes
GET _cat/health
GET _cat/master
GET _cat/fielddata
GET _cat/indices
GET _cat/shards
GET _cat/shards/oldzhang

第十章: 集群注意事项
注意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台

第十一章: 自定义副本分片和索引
索引为2副本3分片
索引为0副本5分片

注意:
索引一旦建立完成,分片数就不可以修改了
但是副本数可以随时修改

命令:
1.创建索引的时候就自定义副本和分片
PUT /yaya/
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 0
}
}

2.修改单个索引的副本数
PUT /yaya/_settings/
{
"settings": {
"number_of_replicas": 0
}
}

3.修改所有的索引的副本数
PUT /_all/_settings/
{
"settings": {
"number_of_replicas": 0
}
}

工作如何设置:
2个节点: 默认就可以
3个节点: 重要的数据,2副本 不重要的默认
日志收集: 1副本3分片

第十二章: 监控
监控注意,不能只监控集群状态
1.监控节点数
2.监控集群状态
3.2者任意一个发生改变了都报警

监控命令:
curl -s 10.0.0.52:9200/_cat/nodes
curl -s 10.0.0.52:9200/_cat/health

第十二章: 增强插件x-pack监控功能
monitoring-->点一下蓝色图标

第十二章: 安全功能
待定

第十四章: 优化
1.内存
不要超过32G

48内存
系统留一半: 24G
自己留一半: 24G
8G 12G 16G 24G 30G

加SSD固态硬盘

备份恢复

前提条件:
必须要有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
node -v
npm -v

2.指定使用国内淘宝npm源
npm install -g cnpm --registry=https://registry.npm.taobao.org

3.安装es-dump
cnpm install elasticdump -g

4.备份命令
elasticdump
--input=http://10.0.0.51:9200/oldzhang
--output=/data/oldzhang.json
--type=data

elasticdump
--input=http://10.0.0.51:9200/oldzhang
--output=$|gzip > /data/oldzhang.json.gz

5.恢复命令
elasticdump
--input=/data/oldzhang.json
--output=http://10.0.0.51:9200/oldzhang

6.注意
恢复的时候需要先解压缩成json格式
恢复的时候,如果已经存在相同的数据,会被覆盖掉
如果新增加的数据,则不影响,继续保留

中文分词

未分词的情况:

1.插入测试数据
POST /newnew/text/1
{"content":"美国留给伊拉克的是个烂摊子吗"}

POST /newnew/text/2
{"content":"公安部:各地校车将享最高路权"}

POST /newnew/text/3
{"content":"中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"}

POST /newnew/text/4
{"content":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"}

2.检测
POST /newnew/_search
{
"query" : { "match" : { "content" : "中国" }},
"highlight" : {
"pre_tags" : ["", ""],
"post_tags" : ["
", ""],
"fields" : {
"content" : {}
}
}
}

分词配置
注意!如果是ES集群,所有的节点都要安装,所有的节点安装完毕之后都要重启

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

2.重启所有ES节点
systemctl restart elasticsearch

3.创建索引
PUT /news

4.创建模板
POST /news/text/_mapping
{
"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" : ["", ""],
"post_tags" : ["
", ""],
"fields" : {
"content" : {}
}
}
}

热更新词典
所有ES节点都操作
https://github.com/medcl/elasticsearch-analysis-ik
1.安装nginx
2.配置分词器配置文件,增加远程地址
3.重启所有的ES节点
4.重新更新数据让分词生效

Elasticsearch_第1张图片
QQ图片20191204121227.png

你可能感兴趣的:(Elasticsearch)