ElasticSearch 知识点整理(入门)
1:es介紹
Elasticsearch是一個(gè)基于Lucene的實(shí)時(shí)的分布式搜索和分析引擎。設(shè)計(jì)用于云計(jì)算中,
能夠達(dá)到實(shí)時(shí)搜索,穩(wěn)定,可靠,快速,安裝使用方便。基于RESTful接口。
普通請(qǐng)求是...get?a=1
rest請(qǐng)求....get/a/1
2:全文搜索的工具有哪些
Lucene Solr Elasticsearch
3:es的bulk的引用場(chǎng)景
1.bulk API可以幫助我們同時(shí)執(zhí)行多個(gè)請(qǐng)求
2.create 和index的區(qū)別
如果數(shù)據(jù)存在,使用create操作失敗,會(huì)提示文檔已經(jīng)存在,使用index則可以成功執(zhí)行。
3.可以使用文件操作
使用文件的方式
vi requests
curl -XPOST/PUT localhost:9200/_bulk --data-binary @request;
bulk請(qǐng)求可以在URL中聲明/_index 或者/_index/_type
4.bulk一次最大處理多少數(shù)據(jù)量
bulk會(huì)把將要處理的數(shù)據(jù)載入內(nèi)存中,所以數(shù)據(jù)量是有限制的
最佳的數(shù)據(jù)量不是一個(gè)確定的數(shù)值,它取決于你的硬件,你的文檔大小以及復(fù)雜性,你的索引以及搜索的負(fù)載
一般建議是1000-5000個(gè)文檔,如果你的文檔很大,可以適當(dāng)減少隊(duì)列,大小建議是5-15MB,默認(rèn)不能超過(guò)100M,
可以在es的配置文件中修改這個(gè)值http.max_content_length: 100mb
5.版本控制的一個(gè)問(wèn)題
在讀數(shù)據(jù)與寫(xiě)數(shù)據(jù)之間如果有其他線程進(jìn)行寫(xiě)操作,就會(huì)出問(wèn)題,es使用版本控制才避免這種問(wèn)題。
在修改數(shù)據(jù)的時(shí)候指定版本號(hào),操作一次版本號(hào)加1。
6.es的兩個(gè)web訪問(wèn)工具
BigDesk Plugin (作者 Luká? Vl?ek) 簡(jiǎn)介:監(jiān)控es狀態(tài)的插件,推薦!主要提供的是節(jié)點(diǎn)的實(shí)時(shí)狀態(tài)監(jiān)控,包括jvm的情況,linux的情況,elasticsearch的情況
Elasticsearch Head Plugin (作者 Ben Birch) 簡(jiǎn)介:很方便對(duì)es進(jìn)行各種操作的客戶端。
4:核心概念
集群 cluster***
代表一個(gè)集群,集群中有多個(gè)節(jié)點(diǎn),其中有一個(gè)為主節(jié)點(diǎn),這個(gè)主節(jié)點(diǎn)是可以通過(guò)選舉產(chǎn)生的,主從節(jié)點(diǎn)是對(duì)于集群內(nèi)部來(lái)說(shuō)的。
es的一個(gè)概念就是去中心化,字面上理解就是無(wú)中心節(jié)點(diǎn),這是對(duì)于集群外部來(lái)說(shuō)的,因?yàn)閺耐獠縼?lái)看es集群,在邏輯上是個(gè)整體,
你與任何一個(gè)節(jié)點(diǎn)的通信和與整個(gè)es集群通信是等價(jià)的。
主節(jié)點(diǎn)的職責(zé)是負(fù)責(zé)管理集群狀態(tài),包括管理分片的狀態(tài)和副本的狀態(tài),以及節(jié)點(diǎn)的發(fā)現(xiàn)和刪除。
只需要在同一個(gè)網(wǎng)段之內(nèi)啟動(dòng)多個(gè)es節(jié)點(diǎn),就可以自動(dòng)組成一個(gè)集群。
默認(rèn)情況下es會(huì)自動(dòng)發(fā)現(xiàn)同一網(wǎng)段內(nèi)的節(jié)點(diǎn),自動(dòng)組成集群。
分片 shards*
代表索引分片,es可以把一個(gè)完整的索引分成多個(gè)分片,這樣的好處是可以把一個(gè)大的索引拆分成多個(gè),分布到不同的節(jié)點(diǎn)上。構(gòu)成分布式搜索。分片的數(shù)量只能在索引創(chuàng)建前指定,并且索引創(chuàng)建后不能更改。
可以在創(chuàng)建索引庫(kù)的時(shí)候指定
curl -XPUT 'localhost:9200/test1/' -d'{"settings":{"number_of_shards":3}}'
默認(rèn)是一個(gè)索引庫(kù)有5個(gè)分片
index.number_of_shards: 5
副本 replicas*
代表索引副本,es可以給索引設(shè)置副本,副本的作用一是提高系統(tǒng)的容錯(cuò)性,當(dāng)某個(gè)節(jié)點(diǎn)某個(gè)分片損壞或丟失時(shí)可以從副本中恢復(fù)。
二是提高es的查詢效率,es會(huì)自動(dòng)對(duì)搜索請(qǐng)求進(jìn)行負(fù)載均衡。
可以在創(chuàng)建索引庫(kù)的時(shí)候指定,副本數(shù)后期可以更改。
curl -XPUT 'localhost:9200/test2/' -d'{"settings":{"number_of_replicas":2}}'
默認(rèn)是一個(gè)分片有1個(gè)副本
index.number_of_replicas: 1
數(shù)據(jù)重新分布 recovery *
代表數(shù)據(jù)恢復(fù)或叫數(shù)據(jù)重新分布,es在有節(jié)點(diǎn)加入或退出時(shí)會(huì)根據(jù)機(jī)器的負(fù)載對(duì)索引分片進(jìn)行重新分配,掛掉的節(jié)點(diǎn)重新啟動(dòng)時(shí)也會(huì)進(jìn)行數(shù)據(jù)恢復(fù)。
數(shù)據(jù)的持久化操作 gateway*
代表es索引的持久化存儲(chǔ)方式,es默認(rèn)是先把索引存放到內(nèi)存中,當(dāng)內(nèi)存滿了時(shí)再持久化到硬盤(pán)。
當(dāng)這個(gè)es集群關(guān)閉再重新啟動(dòng)時(shí)就會(huì)從gateway中讀取索引數(shù)據(jù)。es支持多 種類型的gateway,有本地文件系統(tǒng)(默認(rèn)),分布式文件系統(tǒng),Hadoop的HDFS和amazon的s3云存儲(chǔ)服務(wù)。
自動(dòng)發(fā)現(xiàn)機(jī)制 discovery.zen*
代表es的自動(dòng)發(fā)現(xiàn)節(jié)點(diǎn)機(jī)制,es是一個(gè)基于p2p的系統(tǒng),它先通過(guò)廣播尋找存在的節(jié)點(diǎn),再通過(guò)多播協(xié)議來(lái)進(jìn)行節(jié)點(diǎn)之間的通信,同時(shí)也支持點(diǎn)對(duì)點(diǎn)的交互。
集群或節(jié)點(diǎn)與客戶端交互的方式 Transport*
代表es內(nèi)部節(jié)點(diǎn)或集群與客戶端的交互方式,默認(rèn)內(nèi)部是使用tcp協(xié)議進(jìn)行交互,同時(shí)它支持http協(xié)議(json格式)、thrift、servlet、memcached、zeroMQ等的傳輸協(xié)議(通過(guò)插件方式集成)。
index 和rdbms中的數(shù)據(jù)庫(kù)相似
type 表
document 行
field 列
5:serachType
四種搜索類型,詳細(xì)介紹
分布式搜索的流程
先把查詢請(qǐng)求發(fā)送給集群的某一個(gè)節(jié)點(diǎn)
某個(gè)節(jié)點(diǎn)把最終的結(jié)果返回給客戶端
QUERY_AND_FETCH
1:客戶端把請(qǐng)求發(fā)送給集群中的某一個(gè)節(jié)點(diǎn),這個(gè)節(jié)點(diǎn)會(huì)把查詢請(qǐng)求發(fā)送給所有分片去執(zhí)行,
2:每個(gè)分片會(huì)把查詢的數(shù)據(jù)(包含數(shù)據(jù)的分值,以及數(shù)據(jù)的詳細(xì)內(nèi)容)返回給某一個(gè)節(jié)點(diǎn)進(jìn)行匯總,排序,然后把這些數(shù)據(jù)返回給客戶端
這樣客戶端可能會(huì)收到(10*分片數(shù)量) 的數(shù)據(jù)
這種方案,數(shù)據(jù)量和排名都有問(wèn)題。
優(yōu)點(diǎn):效率高,查詢速度快
QUERY_THEN_FETCH(默認(rèn))
1:客戶端把請(qǐng)求發(fā)送給集群中的某一個(gè)節(jié)點(diǎn),這個(gè)節(jié)點(diǎn)會(huì)把查詢請(qǐng)求發(fā)送給所有分片去執(zhí)行,
2:每個(gè)分片會(huì)把查詢的數(shù)據(jù)(包含數(shù)據(jù)的分值,以及數(shù)據(jù)ID)返回給某一個(gè)節(jié)點(diǎn)進(jìn)行匯總,排序,取前10名
3:根據(jù)前10名的id到對(duì)應(yīng)的分片查詢數(shù)據(jù)的詳細(xì)內(nèi)容,返回給客戶端
這種方案,解決了數(shù)據(jù)量的問(wèn)題。
但是排名還有有問(wèn)題。
(DFS:初始化散發(fā)過(guò)程)
DFS_QUERY_AND_FETCH
1:在查詢之前,會(huì)把所有分片的詞頻和文檔頻率(打分依據(jù))匯總到一塊
2:客戶端把請(qǐng)求發(fā)送給集群中的某一個(gè)節(jié)點(diǎn),這個(gè)節(jié)點(diǎn)會(huì)把查詢請(qǐng)求發(fā)送給所有分片去執(zhí)行,
3:每個(gè)分片會(huì)把查詢的數(shù)據(jù)(包含數(shù)據(jù)的分值,以及數(shù)據(jù)的詳細(xì)內(nèi)容)返回 給某一個(gè)節(jié)點(diǎn)進(jìn)行匯總,排序,然后把這些數(shù)據(jù)返回給客戶端
解決了排名的問(wèn)題
還存在數(shù)據(jù)量的問(wèn)題
DFS_QUERY_THEN_FETCH
1:在查詢之前,會(huì)把所有分片的詞頻和文檔頻率(打分依據(jù))匯總到一塊
2:客戶端把請(qǐng)求發(fā)送給集群中的某一個(gè)節(jié)點(diǎn),這個(gè)節(jié)點(diǎn)會(huì)把查詢請(qǐng)求發(fā)送給所有分片去執(zhí)行,
3:每個(gè)分片會(huì)把查詢的數(shù)據(jù)(包含數(shù)據(jù)的分值,以及數(shù)據(jù)ID)返回給某一個(gè)節(jié)點(diǎn)進(jìn)行匯總,排序,取前10名
4:根據(jù)前10名的id到對(duì)應(yīng)的分片查詢數(shù)據(jù)的詳細(xì)內(nèi)容,返回給客戶端
既解決了排名問(wèn)題,也解決了數(shù)據(jù)量的問(wèn)題
但是性能最低
總結(jié)一下,從性能考慮QUERY_AND_FETCH是最快的,DFS_QUERY_THEN_FETCH是最慢的。從搜索的準(zhǔn)確度來(lái)說(shuō),DFS要比非DFS的準(zhǔn)確度更高。
高亮 補(bǔ):高亮的注意事項(xiàng):
高亮的內(nèi)容和原始內(nèi)容是分開(kāi)返回的
高亮字段的內(nèi)容必須在es中存儲(chǔ)(是否存儲(chǔ)這個(gè)屬性的值必須是true)
分組:分組統(tǒng)計(jì)數(shù)量或者分組統(tǒng)計(jì)分?jǐn)?shù)
刪除索引庫(kù):兩種方式xurl或者java api
Timeout :
?
6:建立索引和查詢的流程
建立索引的流程:
首先根據(jù)空白符進(jìn)行分割再切分關(guān)鍵詞,去除停用詞,如果有英文全部轉(zhuǎn)換為小寫(xiě),對(duì)切分的關(guān)鍵詞建立索引,每個(gè)關(guān)鍵詞都有對(duì)應(yīng)的id,還有一個(gè)倒排索引隊(duì)列存儲(chǔ)該關(guān)鍵詞出現(xiàn)在文檔的id,在該文檔出現(xiàn)的次數(shù),在該文檔出現(xiàn)的位置
查詢的流程:
首先根據(jù)空白符進(jìn)行分割,再切分關(guān)鍵詞,去除停用詞,如果有英文全部轉(zhuǎn)換為小寫(xiě),將切分后的到的關(guān)鍵詞和索引庫(kù)進(jìn)行匹配
中文分詞器-IK
es官方提供的分詞插件對(duì)中文分詞效果不是很好,可以集成ik分詞,對(duì)中文分詞效果比較好
如果想根據(jù)自己的規(guī)則進(jìn)行分詞,可以自定義分詞庫(kù),自定義分詞庫(kù)文件必須以.dic結(jié)尾,詞庫(kù)文件的編碼為utf—8 without bom,一個(gè)詞語(yǔ)一行,將自定義的文件庫(kù)加入到ES_HOME/config/ik/ 目錄下,修改ik的配置文件,重啟生效
7:為什么使用索引工具查詢快
(使用了倒排索引的技術(shù),大致介紹一下倒排索引,還有索引庫(kù)中的詞都是按照順序排列 ,
后期根據(jù)一個(gè)關(guān)鍵詞查詢的時(shí)候,可以利用類似折半查找的算法,查詢效率非常高)
使用了倒排索引的技術(shù),一般我們都是這樣定義id 關(guān)鍵詞,倒排索引是關(guān)鍵詞 id正好相反,使用索引工具進(jìn)行查詢時(shí),首先得到關(guān)鍵詞,建立倒排索引表,關(guān)鍵詞----索引列表包含該關(guān)鍵詞所在的文檔的id、在該文檔中出現(xiàn)的次數(shù)、在該文檔中出現(xiàn)的位置信息,這種由屬性值確定記錄的位置的方式成為倒排索引。還有 索引庫(kù)中的詞都是按照順序排列 ,后期根據(jù)一個(gè)關(guān)鍵詞查詢的時(shí)候,
可以利用類似折半查找的算法,查詢效率非常高
8.setting 與mapping 作用
settings修改索引庫(kù)默認(rèn)配置
例如:分片數(shù)量,副本數(shù)量
查看:curl -XGET https://localhost:9200/crxy/_settings?pretty
(操作不存在索引)
curl -XPUT 'localhost:9200/crxy/' -d'{"settings":"number_of_shards":3,"number_of_replicas":2}}'
(操作已存在索引)
curl -XPUT 'localhost:9200/crxy/_settings' -d'{"index":{"number_of_replicas":2}}'
Mapping,動(dòng)態(tài)mapping機(jī)制:這個(gè)機(jī)制會(huì)自定識(shí)別參數(shù)值的類型,自動(dòng)給這個(gè)參數(shù)設(shè)置屬性
好處:操作方便,不需要提前考慮這個(gè)字段是否在es中定義過(guò)。
弊端:針對(duì)一個(gè)未知的數(shù)據(jù),本來(lái)不應(yīng)該存儲(chǔ)的,這樣也會(huì)存儲(chǔ)了,對(duì)數(shù)據(jù)基本沒(méi)有什么可控性
在實(shí)際開(kāi)發(fā)中,如果數(shù)據(jù)類型已知,建議還是關(guān)閉自動(dòng)mapping。
如果數(shù)據(jù)類型未知,只能使用自定mapping機(jī)制
9:分片查詢方式:
es中默認(rèn)的分片查詢方式為隨機(jī)從分片中取數(shù)據(jù),其他的分片查詢方式還有如:
_local:查詢操作首先在本地查找,如果本地沒(méi)有再到其他節(jié)點(diǎn)進(jìn)行查找
_primary:只在主分片中查詢
_shads:按照指定的分片進(jìn)行查詢,這種查詢方式實(shí)現(xiàn)了es的極速查詢
(在存儲(chǔ)數(shù)據(jù)的時(shí)候通過(guò)rooting參數(shù)可以指定將數(shù)據(jù)分配到某一個(gè)分片中,rooting參數(shù)值相同的分配到一個(gè)分片中,后期查詢時(shí)可以根據(jù)rooting參數(shù)值指定到哪個(gè)分片中查找,從而實(shí)現(xiàn)了極速查詢)
修改源碼自定義從多個(gè)節(jié)點(diǎn)進(jìn)行查詢等
10:es集群的腦裂問(wèn)題
es集群有可能會(huì)出現(xiàn)腦裂問(wèn)題,原因主要有兩個(gè):
1)如果集群中節(jié)點(diǎn)不在同一個(gè)網(wǎng)段有可能是網(wǎng)絡(luò)延遲造成的
2)如果集群中的節(jié)點(diǎn)在同一個(gè)網(wǎng)段,有可能是主節(jié)點(diǎn)負(fù)載太大造成的
解決方案主要有兩種:
1) 把主從節(jié)點(diǎn)的職責(zé)分離,設(shè)置三個(gè)儲(chǔ)備主節(jié)點(diǎn), node.master=true,node.data=false
從節(jié)點(diǎn)只存儲(chǔ)數(shù)據(jù),node.master=false,node.data=true
2)增加延遲時(shí)間
將儲(chǔ)備主節(jié)點(diǎn)數(shù)最小設(shè)為n/2+1個(gè)
11:優(yōu)化
適當(dāng)調(diào)大系統(tǒng)打開(kāi)的最大打開(kāi)文件數(shù),默認(rèn)為1024
修改配置文件調(diào)整es的jvm內(nèi)存的大小,根據(jù)服務(wù)器內(nèi)存的大小,一般分配60%左右,默認(rèn)是256M
分片的數(shù)量最好設(shè)置為5-20個(gè)(es中一個(gè)分片最多存20G的數(shù)據(jù),分片數(shù)在創(chuàng)建索引庫(kù)時(shí)就指定,而且創(chuàng)建后不能修改,分片數(shù)最少設(shè)置為:數(shù)據(jù)量/20G個(gè), 如果所有分片都存滿數(shù)據(jù),需要再重新建立索引庫(kù))分片設(shè)置的過(guò)多過(guò)少都會(huì)導(dǎo)致檢索比較慢,分片數(shù)過(guò)多會(huì)導(dǎo)致檢索時(shí)打開(kāi)比較多的文件,
也會(huì)導(dǎo)致多臺(tái)服務(wù)器之間的通信;分片數(shù)過(guò)少會(huì)導(dǎo)致單個(gè)分片索引過(guò)大,所以檢索速度慢。
副本數(shù)多可以提升搜索能力,但是如果設(shè)置的副本數(shù)過(guò)多也會(huì)對(duì)服務(wù)器造成額外的壓力,因?yàn)樾枰綌?shù)據(jù),所以設(shè)置2-3個(gè)即可
定時(shí)對(duì)索引進(jìn)行優(yōu)化,合并索引片段,一個(gè)索引片段的最好不要超過(guò)1G,將多個(gè)索引片段合并成一個(gè)大的索引片段時(shí),不要太大,太大打開(kāi)會(huì)很慢。
刪除一條數(shù)據(jù)時(shí)不會(huì)立即刪除,而是產(chǎn)生一個(gè).del的文件,在檢索過(guò)程中這部分?jǐn)?shù)據(jù)也會(huì)參與檢索,在檢索過(guò)程中會(huì)判斷是否刪除了,如果刪除了再過(guò)濾掉,這樣會(huì)降低檢索效率,可以定時(shí)執(zhí)行curl命令進(jìn)行刪除或通過(guò)程序代碼進(jìn)行刪除。
如果項(xiàng)目開(kāi)始的時(shí)候需要批量入庫(kù)大量數(shù)據(jù),建議將副本數(shù)設(shè)為0,因?yàn)楦北敬嬖?#xff0c;數(shù)據(jù)要同步到副本,增加es的壓力,索引完成后再將副本數(shù)修改過(guò)來(lái),這樣可以提高索引效率。
去掉mapping中的_all域,這個(gè)雖然會(huì)給查詢帶來(lái)方便,但是會(huì)增加索引時(shí)間和所以尺寸
Log輸出的水平默認(rèn)為trace,查詢超過(guò)500ms即為慢查詢,就要打日志,造成cpu,內(nèi)存,io負(fù)載很高,把log水平調(diào)為info或是修改配置將查詢超時(shí)時(shí)間調(diào)的長(zhǎng)一些。
12:典型的應(yīng)用場(chǎng)景
es+hbase
利用兩個(gè)框架的優(yōu)點(diǎn)實(shí)現(xiàn)快速?gòu)?fù)雜查詢和海量數(shù)據(jù)存儲(chǔ)
Es+hbase:利用這兩個(gè)框架的優(yōu)點(diǎn)實(shí)現(xiàn)快速?gòu)?fù)雜查詢和海量數(shù)據(jù)存儲(chǔ)。
Es通過(guò)建立索引實(shí)現(xiàn)快速查詢,它也可以存儲(chǔ)但是不適合海量數(shù)據(jù)的存儲(chǔ),只存儲(chǔ)需要那些需要從索引庫(kù)中直接返回給客戶的內(nèi)容
Hbase適合海量數(shù)據(jù)存儲(chǔ),按rowkey查詢可以實(shí)現(xiàn)快速查詢,但是按列查詢效率不高,所以結(jié)合es實(shí)現(xiàn)按字段快速查詢
例如:針對(duì)海量的文章數(shù)據(jù)進(jìn)行存儲(chǔ)和快速?gòu)?fù)雜查詢服務(wù)就可以通過(guò)es+hbase
比如文章數(shù)據(jù)有:(如果是面試題,需要問(wèn)清楚需求,需要根據(jù)哪些字段進(jìn)行查詢,哪些內(nèi)容直接從索引庫(kù)中直接返回給客戶,再進(jìn)行下面的設(shè)置)
Es的設(shè)計(jì):
Id:es內(nèi)置,既建立索引也存儲(chǔ)
Title:既建立索引也存儲(chǔ)
Author:不建立索引,存儲(chǔ)
Describe:既建立索引也存儲(chǔ)
Content:建立索引不存儲(chǔ)
Hbase的設(shè)計(jì):
Rowkey的設(shè)計(jì):文章的id
一個(gè)列族:info
列限定符:title,author,describe,content
13.客戶端請(qǐng)求過(guò)程
文檔能夠通過(guò)主要分片(Primary Shard)或者任意一個(gè)副本分片(Replica Shard)獲取。
每個(gè)步驟解釋如下:
客戶端(Client)發(fā)送一個(gè)請(qǐng)求到節(jié)點(diǎn)1。
該節(jié)點(diǎn)利用文檔的_id字段來(lái)判斷該文檔屬于分片0。分片0的分片拷貝(主要分片或者是副本分片)存在于所有的3個(gè)節(jié)點(diǎn)上。這一次,它將請(qǐng)求轉(zhuǎn)發(fā)到了節(jié)點(diǎn)2。
節(jié)點(diǎn)2將文檔返回給節(jié)點(diǎn)1,節(jié)點(diǎn)1隨即將文檔返回給客戶端。 對(duì)于讀請(qǐng)求(Read Request),
請(qǐng)求節(jié)點(diǎn)(Requesting Node)每次都會(huì)選擇一個(gè)不同的分片拷貝來(lái)實(shí)現(xiàn)負(fù)載均衡 -循環(huán)使用所有的分片拷貝。
可能存在這種情況,當(dāng)一份文檔正在被索引時(shí),該文檔在主要分片已經(jīng)就緒了,但是還未被拷貝到其他副本分片上。
此時(shí)副本分片或許報(bào)告文檔不存在(譯注:此時(shí)有讀請(qǐng)求來(lái)獲取該文檔),然而主要分片能夠成功返回需要的文檔 。
一旦索引請(qǐng)求返回給用戶的響應(yīng)是成功,那么文檔在主要分片以及所有副本分片上都是可用的。
總結(jié)
以上是生活随笔為你收集整理的ElasticSearch 知识点整理(入门)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Elasticsearch中的Multi
- 下一篇: ElasticSearch 知识点整理(