ElasticSearch
ElasticSearch:簡稱爲ES,基於Lucene全文檢索引擎服務,支持分佈式集羣(數據橫向擴展、分佈式計算)
應用場景:1. 全文檢索或者搜索服務 2. NOSQL數據庫(ES中的數據單元爲JSON) 3. ELK數據分析平臺
NRT (near real time) 接近實時 ES中的一條數據寫入後大概會有1s的延遲才能被檢索到
9300端口:Es節點之間通訊使用 9200:Es節點和外部通訊使用
Es概念介紹:
名詞 | 說明 | 額外補充 |
---|---|---|
索引(index) | 類似於數據庫中的database | |
類型(type) | 相當於sql中的table | Es6.0以後刪除了類型的概念,6.0還可以設置類型,但只能設置一個 |
文檔(Document) | 相當於sql中的一行記錄 | |
分片(Shard) | 每個索引都有1到多個分片, 每個分片都是一個luncene索引 | 片的好處: 分攤索引的搜索壓力, 分片還支持水平的拓展和拆分以及分佈式的操作, 可以提高搜索和其他處理的效率 |
備份/複製(replicas) | 拷貝一個分片就完成了分片的備份 | 備份的好處: 當主分片失敗或者掛掉, 備份就可以代替分片進行操作, 進而提高了es的可用性, 備份的分片還可以進行搜索操作, 以分攤搜索的壓力. |
映射(Mapping) | 類似於Table的Schema(模式) | 例如:create table person_info(name varchar(20),age tinyint)創建一張表,person後的括號是定義表中的字段,即爲Schema |
analyzer(分析器)介紹
analyzer(分析器)是一個包,這個包由三部分組成,分別是:character filters (字符過濾器)、tokenizer(分詞器)、token filters(token過濾器)。
一個analyzer可以有0個或多個character filters
一個analyzer有且只能有一個tokenizer
一個analyzer可以有0個或多個token filters
character filter 是做字符轉換的,它接收的是文本字符流,輸出也是字符流
tokenizer 是做分詞的,它接收字符流,輸出token流(文本拆分後變成一個一個單詞,這些單詞叫token)
token filter 是做token過濾的,它接收token流,輸出也是token流
由此可見,整個analyzer要做的事情就是將文本拆分成單個單詞,文本 ----> 字符 ----> token
分析器的任務是分析(Analyze)文本數據,分析是分詞,規範化文本的意思
ES在創建索引時, 默認創建5個分片(shard), 每個分片有一份備份/複製分片(replica shard), 可以修改, 分片的數量只能在創建索引的時候指定, 索引創建後就不能修改分片的數量了, 而備份是可以動態修改的
反向索引又叫倒排索引,是根據文章內容中的關鍵字建立索引
Keyword 類型是不會分詞的,直接根據字符串內容建立反向索引,Text 類型在存入 Elasticsearch 的時候,會先分詞(指定分詞器會按指定分詞器分詞,未指定按默認分詞器分詞)),然後根據分詞後的內容建立反向索引
java REST api是通過http訪問,走9200端口(java api是9300端口)。
雖然es帶有java api,但是會引起版本兼容性的問題,以及微弱到可以忽略的性能提升,並且java api在未來的es版本會放棄,官方推薦使用java REST api
每個elasticsaerch分片都是一個Lucene 索引。在單個索引中你最多可以存儲2147483519 (= Integer.MAX_VALUE - 128) 個文檔。你可以使用 _cat/shards api去監控分片的的大小。
Es配置文件
vim elasticsearch.yml
#集羣名字,es啓動後會將具有相同集羣名字的節點放到一個集羣下。
cluster.name: elasticsearch
#節點名字
node.name: "es-node1"
#指定集羣中的節點中有幾個有master資格的節點。
#對於大集羣可以寫3個以上。
discovery.zen.minimum_master_nodes: 2
#設置集羣中自動發現其它節點時ping連接超時時間,默認是3s,
#爲避免因爲網絡差而導致啓動報錯,設成了40s。
discovery.zen.ping.timeout: 40s
#設置是否打開多播發現節點,默認是true
discovery.zen.ping.multicast.enabled: false
#ip地址
network.host: 192.168.137.100
#指明集羣中其它可能爲master的節點ip,以防es啓動後發現不了集羣中的其他節點。
discovery.zen.ping.unicast.hosts:["節點1的 ip","節點2 的ip","節點3的ip"]
一般測試時,只需要改一下cluster.name、node.name、network.host即可,使用默認也可以
Es啓動:
啓動:# bin/elasticsearch
發生以下錯誤:Caused by: java.lang.RuntimeException: can not run elasticsearch as root(不能用root用戶啓動) 原因:root用戶權限過大
解決方案: useradd es (添加一個es用戶)
passwd es (設置用戶es密碼)
chown -R es:es * (給es用戶權限)
切換到上面新添加的es用戶再次執行啓動命令:此時可能會出現3個錯誤
ERROR: [3] bootstrap checks failed
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at
least [65536]
解決(切換到root用戶):
vim /etc/security/limits.conf
# 添加以下內容(*也是,代表所有用戶):增大內存和硬盤
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
[2]:max number of threads [3802] for user [es] is too low, increase to at least [4096]
解決:
vim /etc/security/limits.d/90-nproc.conf(用戶最大線程數)
修改以下內容
* soft nproc 4096(原先是1024)
[3]:max virtual memory areas vm.max_map_count [65530] is too low, increase to at least
[262144]
解決:
vim /etc/sysctl.conf(配置最大線程數)
# 添加以下內容
vm.max_map_count=655360
再次切換到es用戶執行啓動命令成功啓動
Kibana工具
當es啓動後,我們在命令行直接敲es命令是比較麻煩的,因此此時用到kibana插件,kibana是es的一個可視化視圖工具,當然es也有其他的插件,比如elasticsearch-head,ElasticHD等等
kibana的安裝
kibana下載地址:https://www.elastic.co/cn/downloads/kibana,注意:下載的版本要和es使用的版本要對應
kibana的配置文件
vim kibana.yml
#對外服務監聽端口
server.port: 5601
#綁定可以訪問5601端口服務的IP地址,0.0.0.0表示任何地址在沒有防火牆限制的情況下都可以訪問,生產環境別這樣設置,不安全。
server.host: "0.0.0.0"
#默認值爲主機名稱,表示kibana實例綁定的主機,可以是IP地址或者主機名稱.
server.name: "192.168.1.11"
#用來處理ES請求的服務URL
elasticsearch.hosts: ["http://192.168.1.11:9200","http://192.168.1.12:9200"]
#用來控制證書的認證,可選的值爲full,none,certificate。此處由於沒有證書,所以設置爲null,否則啓動會提示錯誤.
elasticsearch.ssl.verificationMode: none
#kibana搜索數據請求超時時間
elasticsearch.requestTimeout: 90000
更多配置信息查看:https://www.elastic.co/guide/en/kibana/5.6/settings.html
啓動命令:kibana文件夾bin/kibana
Es集羣相關操作
查看集羣健康信息 GET /_cat/health?
查看集羣中節點信息 GET /_cat/nodes?v
查看集羣中的索引信息 GET /_cat/indices?v
可以看到我們集羣叫“elasticsearch”,運行狀態是green。每當我們查詢集羣健康情況時,接口可能會返回green,yellow或red狀態。green意味着一切良好(集羣所有的功能都正常)。
yellow意味着所有的數據都是可用的,但是一些複製分片可能沒有正確分發(集羣的所有功能還是正常的)。red意味着因爲某些原因導致有些數據不能使用。
注意,即使集羣狀態是red,它仍然可以運行一部分的功能。(例如,它依然可以從一些可用的分片處理搜索請求)但你應該儘快去修復它,因爲這樣會使搜索結果丟失一些數據
索引相關操作
簡單操作: 創建: put/索引名 刪除:delete/索引名
put、get、post、delete操作
添加數據
put 索引名/類型名/文檔(id) {json數據}
不指定類型(id)時,會隨機生成id值,但只能用post post 索引名/類型名 {json數據}
獲取數據 get 索引名/類型名/文檔(id)
測試文檔是否存在
HEAD 索引名/類型名/文檔(id)
200 - OK 200:該文檔存在 404 - Not Found 404:該文檔不存在
批量獲取 主要是Get (索引名/類型名)_mget {json數據} 具體分類看保存的圖片
批處理操作
POST /索引名/類型/_bulk # 批量插入多個document
{"index":{}}
{"name":"ww","title":"王五","age":18,"created":"2018-12-27"}
{"index":{}}
{"name":"zl","title":"趙六","age":25,"created":"2018-12-27"}
POST /索引名/類型名/_bulk # 批量操作(包含修改和刪除)
{"update":{"_id":"KrOP6WcBVEuCC3JS8V9K"}} # 修改
{"doc":{"title":"王小五"}}
{"delete":{"_id":"K7OP6WcBVEuCC3JS8V9K"}} # 刪除
es更新文檔的原理爲:先找到這個文檔,刪除舊的文檔內容執行更新,更新完後再索引最新的文檔
過濾器 注意: 過濾查詢運行時先執行過濾語句,後執行普通查詢
過濾器的類型
1. term 、 terms Filter
term、terms的含義與查詢時一致。term用於精確匹配、terms用於多詞條匹配
2. ranage filter 3. exists filter 4. ids filter
Query和Filter更詳細的對比可參考:https://blog.csdn.net/laoyang360/article/details/80468757
Mapping Type:
1. 簡單類型: text , keyword , date , long , double , boolean or ip
2. 其它類型: object , geo_point , geo_shape 等
查看類型mapping GET /索引名/_mapping/類型名 GET 索引名/_mapping?pretty
查看某個字段的分詞結果
GET your_index/your_type/your_id/_termvectors?fields=your_fieldsName
IK分詞器
elasticSearch默認的分詞器對中文不是很友好,會將中文單個字的建立索引,因此可以使用ik分詞器
ik分詞器下載地址:https://github.com/medcl/elasticsearch-analysis-ik/releases
同樣,版本儘量和Es相對應。
下載完以後在Es的plugins文件夾中創建一個名爲IK的文件夾,將下載的ik分詞器解壓到該文件夾下,
重新啓動Es,出現plugin [analysis-ik]說明ik分詞器被加載。
Ik分詞器的兩種方式:
智能模式和細粒度模式(智能:對應es的IK插件的ik_smart,細粒度:對應es的IK插件的ik_max_word)
細粒度分詞,包含每一種切分可能(更全);而智能模式,只包含各種切分路徑中最可能的一種。