Elasticsearch入門篇

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-headElasticHD等等
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)
細粒度分詞,包含每一種切分可能(更全);而智能模式,只包含各種切分路徑中最可能的一種。
發佈了15 篇原創文章 · 獲贊 7 · 訪問量 3864
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章