Elasticsearch(ES)是一個基於Lucene構件的開源、分布式、RESTful接口全文搜索引擎。ES還是一個分布式文檔數據庫,其中每個字段均是被索引的數據且可被搜索,它能夠擴展至數以百計的服務器存儲以及處理PB級別的數據。它可以在很短的時間內在存儲、搜索和分析大量的數據。它通常作為具有復雜所搜場景情況下的核心發動機。
ES就是為考可用和可擴展而生的。可以通過購置性能更強的服務器來完成。
Elasticsearch特點
- 橫向可擴展性: 只需要增加台服務器,做一點配置,啟動一下ES就可以並入集群。
- 分片機制提供更好的分布性: 同一個索引被分成多個分片(sharding),這點類似HDFS的塊機制;mapreduce的分而治之的方式可提升處理效率。
- 高可用: 提供復制(replica)機制,一個分片可以存在多個副本,使得某台服務器在宕機的情況下,集群仍舊可以照常運行,並會把服務器宕機丟失的數據信息復制恢復到其他可用的節點上。
Elasticsearch應用場景
大型分布式日志分析系統ELK,elasticsearch(存儲日志)+logstash(收集日志)+kibana(展示數據)
電商系統搜索系統、網盤搜索引擎等。
Elasticsearch存儲結構
Elasticsearch是文件存儲,Elasticsearch是面向文檔型數據庫,一條數據在這里就是一個文檔,用json作為文檔序列化的格式,比如下面這條用戶數據:
{
"user":"zfl",
"sex":"0",
"age":"23"
}
關系型數據庫:數據庫->表->行->列
Elasticsearch:索引(Index)->類型(type)->文檔(Documents)->字段(Fields)
Linux環境安裝ES
- 安裝JDK環境變量
export JAVA_HOME=/usr/local/jdk1.8.0_181
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
source /etc/profile
-
下載Elasticsearch安裝包
官方文檔:https://www.elastic.co/downloads/elasticsearch -
上傳Elasticsearch安裝包

-
解壓Elasticsearch

目錄結構說明如下:bin:腳本文件,包括ES啟動&安裝插件等 config:elasticsearch.yml(ES配置文件)、jvm.options(JVM配置文件)、日志配置文件等 JDK:內置的jdk lib:類庫 logs:日志文件 modules:ES所有模塊,包括X-pack等 plugins:ES已經安裝的插件,默認沒有插件 data:ES啟動的時候,默認與logs同級,用來存儲文檔數據。該目錄可在elasticsearch.yml中配置 -
修改elasticsearch.yml

-
啟動elasticsearch
報錯:不允許使用root用戶直接運行
解決:
- 創建用戶:
創建一個分組
groupadd lnhg
創建用戶並添加進分組
useradd lnhu -g lnhg -p 123456
授予權限
chown -R lnhu:lnhg es安裝目錄
su lnhu 切換用戶

- 繼續報錯:

編輯/etc/sysctl.conf添加如下參數:
vi /etc/sysctl.conf
vm.max_map_count=655360
sysctl -p

- 還會報一個錯,崩潰....

編輯/etc/security/limits.conf添加如下參數:
vi /etc/security/limits.conf
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096


- 到此單機版本搭建完成,重新啟動服務,reboot。

- 訪問Elasticsearch
關閉防火牆 systemctl stop firewalld.service

http://192.168.15.130:9200

- 端口區別(9200和9300)
9200端口:ES節點和外部通訊使用
9300端口:ES節點之間通訊使用
kibana環境安裝(windows安裝)
-
下載kibana-6.2.4-windows-x86_64安裝包並解壓

修改 config/kibana.yml
將默認配置改成如下:
server.port:5601(默認)
server.host: 本機ip(默認localhost)
elasticsearch.url: es地址

-
啟動kibana
雙擊bin目錄下的kibana.bat啟動即可。
Kibana 實現增刪改查
-
創建索引
PUT /lnh

-
查詢索引
GET /lnh

-
添加文檔 /索引名稱/類型/id
PUT /lnh/user/1
{
"user":"lnh",
"sex":"0",
"age":"23"
}

- 查詢文檔
GET /lnh/user/1

- 刪除索引
DELETE /lnh

之后查詢

調用RestFul創建文檔
- 查詢指定數據
http://192.168.15.130:9200/lnh/user/1

- 查詢某類型的全部文檔
http://192.168.15.130:9200/lnh/user/_search

高級查詢
- 根據id進行查詢
GET /lnh/user/1 - 查詢當前所有類型的文檔
GET /lnh/user/_search

- 根據多個ID批量查詢
查詢多個id分別為1、2GET /lnh/user/_mget { "ids":["1","2"] }
- 復雜條件查詢
查詢年齡為23歲的
GET /lnh/user/_search?q=age:23

查詢年齡20-30歲之間的
GET /lnh/user/_search?q=age[20 TO 30]
注意: TO一定要大寫

查詢年齡20-30歲之間的,從0條數據到1條數據
GET /lnh/user/_search?q=age[20 TO 30]&from=0&size=1

DSL語言查詢與過濾
什么是DSL語言
es中的查詢請求有兩種方式,一種是簡易版的查詢,另外一種是使用JSON完整的請求體,叫做結構化查詢(DSL)。
示例
- 根據名稱精確查詢姓名
GET /lnh/user/_search
{
"query":{
"term":{
"user":"zfl"
}
}
}

說明:term是代表完全匹配,不進行分詞器分析,文檔中必須包含整個搜索的詞匯。為精確搜索
- 根據名稱模糊查詢
GET /lnh/user/_search
{
"from":0,
"size":2,
"query":{
"match":{
"user":"partner"
}
}
}

說明:match在匹配時會對所查找的關鍵詞進行分詞,然后按分詞匹配查找,一般用於模糊查詢。
term與match的區別
- term查詢不會對字段進行分詞,會采用精確匹配。
- Match會根據該字段的分詞器,進行分詞查詢。
使用filter過濾年齡
/lnh/user/_search
{
"query":{
"bool":{
"must":[
{
"match_all":{}
}
],
"filter":{
"range":{
"age":{
"gte":20,
"lte":30
}
}
}
}
},
"from":0,
"size":10,
"_source":["user","age"]
}

說明:_source表示指定返回哪些字段
分詞器
什么是分詞器
因為Elasticsearch中默認的標准分詞器對中文分詞不是很友好,會將中文詞語拆分成一個一個中文的漢子。因此引入中文分詞器(ik插件)。
- 默認標准分詞器

安裝ik分詞器
下載地址: https://github.com/medcl/elasticsearch-analysis-ik/releases
注意:ik分詞器插件版本要與es版本保持統一。
- 解壓后的文件目錄

- 在es安裝目錄下plugins目錄下新建一個ik目錄
- 將解壓后的文件復制到plugins/ik目錄下
- 重新啟動es

說明:- ik_max_work:對講文本做最細粒度的拆分,比如會將"中華人民共和國國歌"拆分成為"中華人民共和國,中華人民,中華,華人,人民共和國,人民,人,民,共和國,共和,和,國歌",會窮盡各種可能的組合。
- ik_smart:會做最粗粒度的拆分,比如會將"中華人民共和國國歌"拆分為"中華人民共和國,國歌"。
自定義擴展詞典
- 在es安裝目錄下plugins/ik/config目錄下新建custom目錄,並創建new_word.dic文件

- 向new_word.dic文件中添加自定義詞匯

- 修改 config/IKAnalyzer.cfg.xml文件,將自定義的擴展字典位置填充

文檔映射
介紹
已經把Elasticsearch的核心概念和關系數據庫做了一個對比,索引(index)相當於數據庫,類型(type)相當於數據庫表,映射(mapping)相當於數據表的表結構。Elasticsearch中的映射(mapping)用來定義一個文檔,可以定義所包含的字段以及字段的類型、分詞器及屬性等。
文檔映射就是給文檔中的字段指定字段類型、分詞器。
使用 GET /lnh2/stu/_mapping
映射的分類
- 動態映射
我們知道,在關系數據庫中,需要實現創建數據庫,然后在該數據庫實例下創建數據表,然后才能在該數據庫表中插入數據。而Elasticsearch中不需要實現定義映射(mapping),文檔寫入Elasticsearch時,會根據文檔字段自動識別類型,這種機制稱之為動態映射。 - 靜態映射
在Elasticsearch中也可以實現定義好映射,包含文檔的各個字段及其類型等,這種方式稱之為靜態映射。
基礎數據類型
-
字符串
string,string類型包含text和keyword。
text:該類型被用來索引長文本,在創建索引前會將這些文本進行分詞,轉化為詞的組合,建立索引。允許es來檢索這些詞,text不能用來排序和聚合。
keyword:該類型不需要進行分詞,可以被用來檢索過濾、排序和聚合,keyword類型只能用本身來進行檢索(不可用text分詞后的模糊檢索) -
數值型
long、integer、short、byte、double、float -
日期型
date -
布爾型
boolean -
二進制型
binary -
數組類型
Array datatype
示例
- 創建文檔類型並且指定類型
PUT /lnh2
POST /lnh2/_mapping/stu
{
"properties":{
"age":{
"type":"integer"
},
"sex":{
"type":"integer"
},
"name":{
"type":"text",
"analyzer":"ik_smart",
"search_analyzer":"ik_smart"
},
"home":{
"type":"keyword"
}
}
}

- 獲取指定類型的mapping信息

- 獲取索引信息
http://192.168.15.130:9200/lnh2/_settings

Elasticsearch集群管理
- 如何解決高並發
ES是一個分布式全文檢索框架,隱藏了復雜的處理機制,包括分片機制,集群發現,分片負載均衡,請求路由。 - 基本概念
- cluster
代表一個集群,集群中有很多的節點,其中有一個為主節點,這個主節點是可以通過選舉產生的,
主從節點是對於集群內部來說的。es的一個概念就是去中心化,字面上理解就是無中心節點,
這是對於集群外部來說的,因為從外部來看es集群,在邏輯上是個整體,你與任何一個節點的通信和
整個es集群通信是等價的。
- shards
代表索引的分片,es可以把一個完整的索引分成多個分片,這樣的好處是可以把一個大的索引拆分成多個,分布到
不同的節點上。構成分布式搜索。分片的數量只能在索引創建前指定,並且索引創建后不能更改。
- replicas
代表索引的副本,es可以設置多個索引的副本,副本的作用一是提高系統的容錯性,當某個節點某個分片損壞或
丟失時可以從副本中恢復。二是提高es的查詢效率,es會自動對搜索請求進行負載均衡。
- recovery
代表數據恢復或叫做重新分布,es在有節點加入或者退出時會根據機器的負載均衡對索引分片進行重新分配,掛掉的節點重新啟動時也會進行數據恢復。
- 核心原理分析
1. 每個索引會被分成多個分片shards進行存儲,默認創建索引是分配五個分片進行存儲。
每個分片都會分布式部署在多個不同的節點上進行存儲,該分片成為primary shards。
主分片定義好后,后面不能做修改。原因是在查詢的時候,根據文檔id%主分片數量獲取分片位置。
路由算法:shard = hash(routing)%主分片數量。
2. 每一個主分片為了實現高可用,都會有自己對應的備份分片,主分片對應的備份分片不能存放在同一台服務器
上。主分片primary shards可以和其他replicas shards存放在一個Node節點上。
假設主分片3 備份1 主分片3個,每個主分片對應1個備份分片=3*2=6
主分片3 備份2 主分片3個,每個主分片對應的2個備份分片=3*3=9
Es集群環境搭建
-
准備三台服務器集群
服務器名稱 IP地址 node-0 192.168.15.130 node-1 192.168.15.131 node-2 192.168.15.132 -
服務器集群配置修改(每台)
vi elasticsearch.yml cluster.name: lnh ###保證三台服務器節點集群名稱相同 node.name: node-0 #### 每個節點名稱不一樣 其他兩台為node-1 ,node-2 network.host: 192.168.15.130 #### 實際服務器ip地址 discovery.zen.ping.unicast.hosts: ["192.168.15.130", "192.168.15.131","192.168.15.132"]##多個服務集群ip discovery.zen.minimum_master_nodes: 1 -
啟動
啟動每個es,關閉防火牆 systemctl stop firewalld.service -
驗證
訪問:http://192.168.15.130:9200/_cat/nodes?pretty

*號代表主節點
注意:如果是克隆的機器,請先刪除每台的data數據目錄,默認在安裝目錄下data,es啟動時會有,可以配置。
該資源匯總於螞蟻課堂,做一次梳理,都說好記性不如爛筆頭。

