Elasticsearch

Elasticsearch應(yīng)用場(chǎng)景

1.搜索: 電商,百科
2.高亮顯示: github
3.分析和數(shù)據(jù)挖掘: ELk

Elasticsearch特點(diǎn)

1.高性能,分布式
2.對(duì)運(yùn)維友好,不需要會(huì)java語(yǔ)言,開(kāi)箱即用
3.功能豐富

Elasticsearch在電商搜索的實(shí)現(xiàn)

mysql:
skuid name
1 狗糧100kg
2 貓糧50kg
3 貓罐頭200g

ES:

聚合運(yùn)算之后得到SKUID:
1
2
拿到ID之后,mysql就只需要簡(jiǎn)單地where查詢(xún)即可
mysql:
select xx from xxx where skuid 1

ES安裝啟動(dòng)

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配置以及內(nèi)存鎖定

1.查看ES有哪些配置
[root@db01 ~]# rpm -qc elasticsearch
/etc/elasticsearch/elasticsearch.yml #主配置文件
/etc/elasticsearch/jvm.options #JVM虛擬機(jī)配置
/etc/init.d/elasticsearch #init啟動(dòng)文件
/etc/sysconfig/elasticsearch #環(huán)境變量相關(guān)配置
/usr/lib/sysctl.d/elasticsearch.conf #環(huán)境變量相關(guān)配置
/usr/lib/systemd/system/elasticsearch.service #systemc啟動(dòng)文件

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.重啟服務(wù)后發(fā)現(xiàn)報(bào)錯(cuò)
systemctl restart elasticsearch

4.解決內(nèi)存鎖定失敗:
查看日志發(fā)現(xiàn)提示內(nèi)存鎖定失敗
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命令:
最繁瑣
最復(fù)雜
最容易出錯(cuò)
不需要安裝任何軟件,只需要有curl命令

es-head插件:
查看數(shù)據(jù)方便
操作相對(duì)容易
需要node環(huán)境

kibana:
查看數(shù)據(jù)以及報(bào)表格式豐富
操作很簡(jiǎn)單
需要java環(huán)境和安裝配置kibana

es-head插件安裝

注意:需要修改配置文件添加允許跨域參數(shù)
修改ES配置文件支持跨域
http.cors.enabled: true
http.cors.allow-origin: "*"

es-head 三種方式:
1.npm安裝方式

  • 需要nodejs環(huán)境
  • 需要連接國(guó)外源

2.docker安裝

3.google瀏覽器插件

  • 修改文件名為zip后綴
  • 解壓目錄
  • 拓展程序-開(kāi)發(fā)者模式-打開(kāi)已解壓的目錄
  • 連接地址修改為ES的IP地址

4.具體操作命令

Head插件在5.0以后安裝方式發(fā)生了改變,需要nodejs環(huán)境支持,或者直接使用別人封裝好的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.啟動(dòng)kibana
systemctl start kibana

4.操作ES
Dev Tools

關(guān)鍵詞:
1.Lucene
2.java
3.全文檢索
4.倒排索引

kibana測(cè)試語(yǔ)句

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簡(jiǎn)單增刪改查語(yǔ)句

第一章: 創(chuàng)建索引
PUT index

第二章: 插入數(shù)據(jù)
1.使用自定義的ID
PUT oldzhang/info/1
{
"name": "zhang",
"age": "29"
}

2.使用隨機(jī)ID
POST oldzhang/info/
{
"name": "zhang",
"age": "29",
"pet": "xiaoqi"
}

第三章: 查詢(xún)數(shù)據(jù)
1.簡(jiǎn)單查詢(xún)
GET /oldzhang/_search
GET /oldzhang/_search/1

2.單個(gè)條件查詢(xún)
GET /oldzhang/_search
{
"query" : {
"term" : { "job" : "it" }
}
}

3.多個(gè)條件查詢(xún)
GET /oldzhang/_search
{
"query" : {
"bool": {
"must": [
{"match": {"pet": "xiao10"}},
{"match": {"name": "ya"}}
],
"filter": {
"range": {
"age": {
"gte": 27,
"lte": 30
}
}
}
}
}
}
}

4.查詢(xún)方式

  • curl命令
  • es-head 基礎(chǔ)查詢(xún)多個(gè)條件
  • es-head 左側(cè)字段查詢(xún)
  • kibana dev-tools 命令查詢(xún)
  • kibana 索引查詢(xún)

第四章: 更新數(shù)據(jù)
GET oldzhang/info/1

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

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

第五章: 刪除數(shù)據(jù)
1.刪除指定ID的數(shù)據(jù)
DELETE oldzhang/info/1

2.刪除符合條件的數(shù)據(jù)
POST oldzhang/_delete_by_query
{
"query" : {
"match":{
"age":"29"
}
}
}

3.刪除索引
DELETE oldzhang

4.!!!警告!!!
盡量不要在命令行或者Kibana里刪除,因?yàn)闆](méi)有任何警告
建議使用es-head刪除
生產(chǎn)環(huán)境可以先把索引關(guān)閉掉,如果一段時(shí)間沒(méi)人訪問(wèn)了再刪除

集群相關(guān)名詞

1.集群健康狀態(tài)
綠色: 所有數(shù)據(jù)都完整,并且副本數(shù)滿(mǎn)足
黃色: 所有數(shù)據(jù)都完整,但是有的索引副本數(shù)不滿(mǎn)足
紅色: 有的索引數(shù)據(jù)不完整

默認(rèn)創(chuàng)建索引:
5分片
1副本

2.節(jié)點(diǎn)類(lèi)型
主節(jié)點(diǎn): 負(fù)責(zé)調(diào)度數(shù)據(jù)分配到哪個(gè)節(jié)點(diǎn)
數(shù)據(jù)節(jié)點(diǎn): 負(fù)責(zé)處理落到自己身上的請(qǐng)求
默認(rèn): 主節(jié)點(diǎn)同時(shí)也是數(shù)據(jù)節(jié)點(diǎn)

3.數(shù)據(jù)分片
主分片: 實(shí)際存儲(chǔ)的數(shù)據(jù),負(fù)責(zé)讀寫(xiě),粗框的是主分片
副本分片: 主分片的副本,提供讀,同步主分片,細(xì)框的是副本分片

4.副本:
主分片的備份,副本數(shù)量可以自定義

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

  • 索引創(chuàng)建的時(shí)候可以指定分片數(shù)和副本數(shù)
  • 索引一旦創(chuàng)建成功,分片數(shù)就不能修改了,但是可以調(diào)整副本數(shù)

部署ES集群

0.從db01拉取數(shù)據(jù)
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配置文件
配置內(nèi)存鎖定:
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臺(tái)機(jī)器都重新啟動(dòng)es
systemctl restart elasticsearch.service

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

ES集群相關(guān)注意

注意事項(xiàng):
1.插入和讀取數(shù)據(jù)在任意節(jié)點(diǎn)都可以執(zhí)行,效果一樣
2.es-head可以連接集群內(nèi)任一臺(tái)服務(wù)

3.主節(jié)點(diǎn)負(fù)責(zé)讀寫(xiě)
如果主分片所在的節(jié)點(diǎn)壞掉了,副本分片會(huì)升為主分片

4.主節(jié)點(diǎn)負(fù)責(zé)調(diào)度
如果主節(jié)點(diǎn)壞掉了,數(shù)據(jù)節(jié)點(diǎn)會(huì)自動(dòng)升為主節(jié)點(diǎn)

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

第十章: 集群注意事項(xiàng)
注意1:發(fā)現(xiàn)節(jié)點(diǎn)參數(shù)不需要把集群內(nèi)所有的機(jī)器IP都加上
只需要包含集群內(nèi)任意一個(gè)IP和自己的IP就可以
discovery.zen.ping.unicast.hosts: ["10.0.0.51","10.0.0.53"]

注意2: 集群選舉相關(guān)的參數(shù)需要設(shè)置為集群節(jié)點(diǎn)數(shù)的大多數(shù)
discovery.zen.minimum_master_nodes: 2

注意3: 默認(rèn)創(chuàng)建索引為1副本5分片

注意4: 數(shù)據(jù)分配的時(shí)候會(huì)出現(xiàn)2中顏色
紫色: 正在遷移
黃色: 正在復(fù)制
綠色: 正常

注意5: 3節(jié)點(diǎn)的時(shí)候
0副本一臺(tái)都不能壞
1副本的極限情況下可以壞2臺(tái): 1臺(tái)1臺(tái)的壞,不能同時(shí)壞2臺(tái)
2副本的情況可以同時(shí)壞2臺(tái)

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

注意:
索引一旦建立完成,分片數(shù)就不可以修改了
但是副本數(shù)可以隨時(shí)修改

命令:
1.創(chuàng)建索引的時(shí)候就自定義副本和分片
PUT /yaya/
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 0
}
}

2.修改單個(gè)索引的副本數(shù)
PUT /yaya/_settings/
{
"settings": {
"number_of_replicas": 0
}
}

3.修改所有的索引的副本數(shù)
PUT /_all/_settings/
{
"settings": {
"number_of_replicas": 0
}
}

工作如何設(shè)置:
2個(gè)節(jié)點(diǎn): 默認(rèn)就可以
3個(gè)節(jié)點(diǎn): 重要的數(shù)據(jù),2副本 不重要的默認(rèn)
日志收集: 1副本3分片

第十二章: 監(jiān)控
監(jiān)控注意,不能只監(jiān)控集群狀態(tài)
1.監(jiān)控節(jié)點(diǎn)數(shù)
2.監(jiān)控集群狀態(tài)
3.2者任意一個(gè)發(fā)生改變了都報(bào)警

監(jiān)控命令:
curl -s 10.0.0.52:9200/_cat/nodes
curl -s 10.0.0.52:9200/_cat/health

第十二章: 增強(qiáng)插件x-pack監(jiān)控功能
monitoring-->點(diǎn)一下藍(lán)色圖標(biāo)

第十二章: 安全功能
待定

第十四章: 優(yōu)化
1.內(nèi)存
不要超過(guò)32G

48內(nèi)存
系統(tǒng)留一半: 24G
自己留一半: 24G
8G 12G 16G 24G 30G

加SSD固態(tài)硬盤(pán)

備份恢復(fù)

前提條件:
必須要有Node環(huán)境和npm軟件
nodejs
npm

1.nodejs環(huán)境安裝
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.指定使用國(guó)內(nèi)淘寶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.恢復(fù)命令
elasticdump
--input=/data/oldzhang.json
--output=http://10.0.0.51:9200/oldzhang

6.注意
恢復(fù)的時(shí)候需要先解壓縮成json格式
恢復(fù)的時(shí)候,如果已經(jīng)存在相同的數(shù)據(jù),會(huì)被覆蓋掉
如果新增加的數(shù)據(jù),則不影響,繼續(xù)保留

中文分詞

未分詞的情況:

1.插入測(cè)試數(shù)據(jù)
POST /newnew/text/1
{"content":"美國(guó)留給伊拉克的是個(gè)爛攤子嗎"}

POST /newnew/text/2
{"content":"公安部:各地校車(chē)將享最高路權(quán)"}

POST /newnew/text/3
{"content":"中韓漁警沖突調(diào)查:韓警平均每天扣1艘中國(guó)漁船"}

POST /newnew/text/4
{"content":"中國(guó)駐洛杉磯領(lǐng)事館遭亞裔男子槍擊 嫌犯已自首"}

2.檢測(cè)
POST /newnew/_search
{
"query" : { "match" : { "content" : "中國(guó)" }},
"highlight" : {
"pre_tags" : ["<tag1>", "<tag2>"],
"post_tags" : ["</tag1>", "</tag2>"],
"fields" : {
"content" : {}
}
}
}

分詞配置
注意!如果是ES集群,所有的節(jié)點(diǎn)都要安裝,所有的節(jié)點(diǎn)安裝完畢之后都要重啟

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節(jié)點(diǎn)
systemctl restart elasticsearch

3.創(chuàng)建索引
PUT /news

4.創(chuàng)建模板
POST /news/text/_mapping
{
"properties": {
"content": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_smart"
}
}

}

5.插入測(cè)試數(shù)據(jù)
POST /news/text/1
{"content":"美國(guó)留給伊拉克的是個(gè)爛攤子嗎"}

POST /news/text/2
{"content":"公安部:各地校車(chē)將享最高路權(quán)"}

POST /news/text/3
{"content":"中韓漁警沖突調(diào)查:韓警平均每天扣1艘中國(guó)漁船"}

POST /news/text/4
{"content":"中國(guó)駐洛杉磯領(lǐng)事館遭亞裔男子槍擊 嫌犯已自首"}

6.再次查詢(xún)數(shù)據(jù)發(fā)現(xiàn)已經(jīng)能識(shí)別中文了
POST /news/_search
{
"query" : { "match" : { "content" : "中國(guó)" }},
"highlight" : {
"pre_tags" : ["<tag1>", "<tag2>"],
"post_tags" : ["</tag1>", "</tag2>"],
"fields" : {
"content" : {}
}
}
}

熱更新詞典
所有ES節(jié)點(diǎn)都操作
https://github.com/medcl/elasticsearch-analysis-ik
1.安裝nginx
2.配置分詞器配置文件,增加遠(yuǎn)程地址
3.重啟所有的ES節(jié)點(diǎn)
4.重新更新數(shù)據(jù)讓分詞生效

QQ圖片20191204121227.png

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容