日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

ElasticSearch 知识点整理(入门)

發(fā)布時間:2024/1/23 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ElasticSearch 知识点整理(入门) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1:es介紹

Elasticsearch是一個基于Lucene的實時的分布式搜索和分析引擎。設(shè)計用于云計算中,

能夠達到實時搜索,穩(wěn)定,可靠,快速,安裝使用方便。基于RESTful接口。

普通請求是...get?a=1

rest請求....get/a/1

2:全文搜索的工具有哪些

Lucene Solr Elasticsearch

3:es的bulk的引用場景

1.bulk API可以幫助我們同時執(zhí)行多個請求

2.create 和index的區(qū)別

如果數(shù)據(jù)存在,使用create操作失敗,會提示文檔已經(jīng)存在,使用index則可以成功執(zhí)行。

3.可以使用文件操作

使用文件的方式

vi requests

curl -XPOST/PUT localhost:9200/_bulk --data-binary @request;

bulk請求可以在URL中聲明/_index 或者/_index/_type

4.bulk一次最大處理多少數(shù)據(jù)量

bulk會把將要處理的數(shù)據(jù)載入內(nèi)存中,所以數(shù)據(jù)量是有限制的

最佳的數(shù)據(jù)量不是一個確定的數(shù)值,它取決于你的硬件,你的文檔大小以及復雜性,你的索引以及搜索的負載

一般建議是1000-5000個文檔,如果你的文檔很大,可以適當減少隊列,大小建議是5-15MB,默認不能超過100M,

可以在es的配置文件中修改這個值http.max_content_length: 100mb

5.版本控制的一個問題

在讀數(shù)據(jù)與寫數(shù)據(jù)之間如果有其他線程進行寫操作,就會出問題,es使用版本控制才避免這種問題。

在修改數(shù)據(jù)的時候指定版本號,操作一次版本號加1。

6.es的兩個web訪問工具

BigDesk Plugin (作者 Luká? Vl?ek) 簡介:監(jiān)控es狀態(tài)的插件,推薦!主要提供的是節(jié)點的實時狀態(tài)監(jiān)控,包括jvm的情況,linux的情況,elasticsearch的情況

Elasticsearch Head Plugin (作者 Ben Birch) 簡介:很方便對es進行各種操作的客戶端。

4:核心概念

集群 cluster***

代表一個集群,集群中有多個節(jié)點,其中有一個為主節(jié)點,這個主節(jié)點是可以通過選舉產(chǎn)生的,主從節(jié)點是對于集群內(nèi)部來說的。

es的一個概念就是去中心化,字面上理解就是無中心節(jié)點,這是對于集群外部來說的,因為從外部來看es集群,在邏輯上是個整體,

你與任何一個節(jié)點的通信和與整個es集群通信是等價的。

主節(jié)點的職責是負責管理集群狀態(tài),包括管理分片的狀態(tài)和副本的狀態(tài),以及節(jié)點的發(fā)現(xiàn)和刪除。

只需要在同一個網(wǎng)段之內(nèi)啟動多個es節(jié)點,就可以自動組成一個集群。

默認情況下es會自動發(fā)現(xiàn)同一網(wǎng)段內(nèi)的節(jié)點,自動組成集群。

分片 shards*

代表索引分片,es可以把一個完整的索引分成多個分片,這樣的好處是可以把一個大的索引拆分成多個,分布到不同的節(jié)點上。構(gòu)成分布式搜索。分片的數(shù)量只能在索引創(chuàng)建前指定,并且索引創(chuàng)建后不能更改。

可以在創(chuàng)建索引庫的時候指定

curl -XPUT 'localhost:9200/test1/' -d'{"settings":{"number_of_shards":3}}'

默認是一個索引庫有5個分片

index.number_of_shards: 5

副本 replicas*

代表索引副本,es可以給索引設(shè)置副本,副本的作用一是提高系統(tǒng)的容錯性,當某個節(jié)點某個分片損壞或丟失時可以從副本中恢復。

二是提高es的查詢效率,es會自動對搜索請求進行負載均衡。

可以在創(chuàng)建索引庫的時候指定,副本數(shù)后期可以更改。

curl -XPUT 'localhost:9200/test2/' -d'{"settings":{"number_of_replicas":2}}'

默認是一個分片有1個副本

index.number_of_replicas: 1

數(shù)據(jù)重新分布 recovery *

代表數(shù)據(jù)恢復或叫數(shù)據(jù)重新分布,es在有節(jié)點加入或退出時會根據(jù)機器的負載對索引分片進行重新分配,掛掉的節(jié)點重新啟動時也會進行數(shù)據(jù)恢復。

數(shù)據(jù)的持久化操作 gateway*

代表es索引的持久化存儲方式,es默認是先把索引存放到內(nèi)存中,當內(nèi)存滿了時再持久化到硬盤。

當這個es集群關(guān)閉再重新啟動時就會從gateway中讀取索引數(shù)據(jù)。es支持多 種類型的gateway,有本地文件系統(tǒng)(默認),分布式文件系統(tǒng),Hadoop的HDFS和amazon的s3云存儲服務(wù)。

自動發(fā)現(xiàn)機制 discovery.zen*

代表es的自動發(fā)現(xiàn)節(jié)點機制,es是一個基于p2p的系統(tǒng),它先通過廣播尋找存在的節(jié)點,再通過多播協(xié)議來進行節(jié)點之間的通信,同時也支持點對點的交互。

集群或節(jié)點與客戶端交互的方式 Transport*

代表es內(nèi)部節(jié)點或集群與客戶端的交互方式,默認內(nèi)部是使用tcp協(xié)議進行交互,同時它支持http協(xié)議(json格式)、thrift、servlet、memcached、zeroMQ等的傳輸協(xié)議(通過插件方式集成)。

index 和rdbms中的數(shù)據(jù)庫相似

type 表

document 行

field 列

5:serachType

四種搜索類型,詳細介紹

分布式搜索的流程

先把查詢請求發(fā)送給集群的某一個節(jié)點

某個節(jié)點把最終的結(jié)果返回給客戶端

QUERY_AND_FETCH

1:客戶端把請求發(fā)送給集群中的某一個節(jié)點,這個節(jié)點會把查詢請求發(fā)送給所有分片去執(zhí)行,

2:每個分片會把查詢的數(shù)據(jù)(包含數(shù)據(jù)的分值,以及數(shù)據(jù)的詳細內(nèi)容)返回給某一個節(jié)點進行匯總,排序,然后把這些數(shù)據(jù)返回給客戶端

這樣客戶端可能會收到(10*分片數(shù)量) 的數(shù)據(jù)

這種方案,數(shù)據(jù)量和排名都有問題。

優(yōu)點:效率高,查詢速度快

QUERY_THEN_FETCH(默認)

1:客戶端把請求發(fā)送給集群中的某一個節(jié)點,這個節(jié)點會把查詢請求發(fā)送給所有分片去執(zhí)行,

2:每個分片會把查詢的數(shù)據(jù)(包含數(shù)據(jù)的分值,以及數(shù)據(jù)ID)返回給某一個節(jié)點進行匯總,排序,取前10名

3:根據(jù)前10名的id到對應(yīng)的分片查詢數(shù)據(jù)的詳細內(nèi)容,返回給客戶端

這種方案,解決了數(shù)據(jù)量的問題。

但是排名還有有問題。

(DFS:初始化散發(fā)過程)

DFS_QUERY_AND_FETCH

1:在查詢之前,會把所有分片的詞頻和文檔頻率(打分依據(jù))匯總到一塊

2:客戶端把請求發(fā)送給集群中的某一個節(jié)點,這個節(jié)點會把查詢請求發(fā)送給所有分片去執(zhí)行,

3:每個分片會把查詢的數(shù)據(jù)(包含數(shù)據(jù)的分值,以及數(shù)據(jù)的詳細內(nèi)容)返回 給某一個節(jié)點進行匯總,排序,然后把這些數(shù)據(jù)返回給客戶端

解決了排名的問題

還存在數(shù)據(jù)量的問題

DFS_QUERY_THEN_FETCH

1:在查詢之前,會把所有分片的詞頻和文檔頻率(打分依據(jù))匯總到一塊

2:客戶端把請求發(fā)送給集群中的某一個節(jié)點,這個節(jié)點會把查詢請求發(fā)送給所有分片去執(zhí)行,

3:每個分片會把查詢的數(shù)據(jù)(包含數(shù)據(jù)的分值,以及數(shù)據(jù)ID)返回給某一個節(jié)點進行匯總,排序,取前10名

4:根據(jù)前10名的id到對應(yīng)的分片查詢數(shù)據(jù)的詳細內(nèi)容,返回給客戶端

既解決了排名問題,也解決了數(shù)據(jù)量的問題

但是性能最低

總結(jié)一下,從性能考慮QUERY_AND_FETCH是最快的,DFS_QUERY_THEN_FETCH是最慢的。從搜索的準確度來說,DFS要比非DFS的準確度更高。

高亮 補:高亮的注意事項:

高亮的內(nèi)容和原始內(nèi)容是分開返回的

高亮字段的內(nèi)容必須在es中存儲(是否存儲這個屬性的值必須是true)

分組:分組統(tǒng)計數(shù)量或者分組統(tǒng)計分數(shù)

刪除索引庫:兩種方式xurl或者java api

Timeout :

?

6:建立索引和查詢的流程

建立索引的流程

首先根據(jù)空白符進行分割再切分關(guān)鍵詞,去除停用詞,如果有英文全部轉(zhuǎn)換為小寫,對切分的關(guān)鍵詞建立索引,每個關(guān)鍵詞都有對應(yīng)的id,還有一個倒排索引隊列存儲該關(guān)鍵詞出現(xiàn)在文檔的id,在該文檔出現(xiàn)的次數(shù),在該文檔出現(xiàn)的位置

查詢的流程:

首先根據(jù)空白符進行分割,再切分關(guān)鍵詞,去除停用詞,如果有英文全部轉(zhuǎn)換為小寫,將切分后的到的關(guān)鍵詞和索引庫進行匹配

中文分詞器-IK

es官方提供的分詞插件對中文分詞效果不是很好,可以集成ik分詞,對中文分詞效果比較好

如果想根據(jù)自己的規(guī)則進行分詞,可以自定義分詞庫,自定義分詞庫文件必須以.dic結(jié)尾,詞庫文件的編碼為utf—8 without bom,一個詞語一行,將自定義的文件庫加入到ES_HOME/config/ik/ 目錄下,修改ik的配置文件,重啟生效

7:為什么使用索引工具查詢快

(使用了倒排索引的技術(shù),大致介紹一下倒排索引,還有索引庫中的詞都是按照順序排列 ,

后期根據(jù)一個關(guān)鍵詞查詢的時候,可以利用類似折半查找的算法,查詢效率非常高)

使用了倒排索引的技術(shù),一般我們都是這樣定義id 關(guān)鍵詞,倒排索引是關(guān)鍵詞 id正好相反,使用索引工具進行查詢時,首先得到關(guān)鍵詞,建立倒排索引表,關(guān)鍵詞----索引列表包含該關(guān)鍵詞所在的文檔的id、在該文檔中出現(xiàn)的次數(shù)、在該文檔中出現(xiàn)的位置信息,這種由屬性值確定記錄的位置的方式成為倒排索引。還有 索引庫中的詞都是按照順序排列 ,后期根據(jù)一個關(guān)鍵詞查詢的時候,

可以利用類似折半查找的算法,查詢效率非常高

8.setting 與mapping 作用

settings修改索引庫默認配置

例如:分片數(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,動態(tài)mapping機制:這個機制會自定識別參數(shù)值的類型,自動給這個參數(shù)設(shè)置屬性

好處:操作方便,不需要提前考慮這個字段是否在es中定義過。

弊端:針對一個未知的數(shù)據(jù),本來不應(yīng)該存儲的,這樣也會存儲了,對數(shù)據(jù)基本沒有什么可控性

在實際開發(fā)中,如果數(shù)據(jù)類型已知,建議還是關(guān)閉自動mapping。

如果數(shù)據(jù)類型未知,只能使用自定mapping機制

9:分片查詢方式:

es中默認的分片查詢方式為隨機從分片中取數(shù)據(jù),其他的分片查詢方式還有如:

_local:查詢操作首先在本地查找,如果本地沒有再到其他節(jié)點進行查找

_primary:只在主分片中查詢

_shads:按照指定的分片進行查詢,這種查詢方式實現(xiàn)了es的極速查詢

(在存儲數(shù)據(jù)的時候通過rooting參數(shù)可以指定將數(shù)據(jù)分配到某一個分片中,rooting參數(shù)值相同的分配到一個分片中,后期查詢時可以根據(jù)rooting參數(shù)值指定到哪個分片中查找,從而實現(xiàn)了極速查詢)

修改源碼自定義從多個節(jié)點進行查詢等

10:es集群的腦裂問題

es集群有可能會出現(xiàn)腦裂問題,原因主要有兩個:

1)如果集群中節(jié)點不在同一個網(wǎng)段有可能是網(wǎng)絡(luò)延遲造成的

2)如果集群中的節(jié)點在同一個網(wǎng)段,有可能是主節(jié)點負載太大造成的

解決方案主要有兩種:

1) 把主從節(jié)點的職責分離,設(shè)置三個儲備主節(jié)點, node.master=true,node.data=false

從節(jié)點只存儲數(shù)據(jù),node.master=false,node.data=true

2)增加延遲時間

將儲備主節(jié)點數(shù)最小設(shè)為n/2+1個

11:優(yōu)化

適當調(diào)大系統(tǒng)打開的最大打開文件數(shù),默認為1024

修改配置文件調(diào)整es的jvm內(nèi)存的大小,根據(jù)服務(wù)器內(nèi)存的大小,一般分配60%左右,默認是256M

分片的數(shù)量最好設(shè)置為5-20個(es中一個分片最多存20G的數(shù)據(jù),分片數(shù)在創(chuàng)建索引庫時就指定,而且創(chuàng)建后不能修改,分片數(shù)最少設(shè)置為:數(shù)據(jù)量/20G個, 如果所有分片都存滿數(shù)據(jù),需要再重新建立索引庫)分片設(shè)置的過多過少都會導致檢索比較慢,分片數(shù)過多會導致檢索時打開比較多的文件,

也會導致多臺服務(wù)器之間的通信;分片數(shù)過少會導致單個分片索引過大,所以檢索速度慢。

副本數(shù)多可以提升搜索能力,但是如果設(shè)置的副本數(shù)過多也會對服務(wù)器造成額外的壓力,因為需要同步數(shù)據(jù),所以設(shè)置2-3個即可

定時對索引進行優(yōu)化,合并索引片段,一個索引片段的最好不要超過1G,將多個索引片段合并成一個大的索引片段時,不要太大,太大打開會很慢。

刪除一條數(shù)據(jù)時不會立即刪除,而是產(chǎn)生一個.del的文件,在檢索過程中這部分數(shù)據(jù)也會參與檢索,在檢索過程中會判斷是否刪除了,如果刪除了再過濾掉,這樣會降低檢索效率,可以定時執(zhí)行curl命令進行刪除或通過程序代碼進行刪除。

如果項目開始的時候需要批量入庫大量數(shù)據(jù),建議將副本數(shù)設(shè)為0,因為副本存在,數(shù)據(jù)要同步到副本,增加es的壓力,索引完成后再將副本數(shù)修改過來,這樣可以提高索引效率。

去掉mapping中的_all域,這個雖然會給查詢帶來方便,但是會增加索引時間和所以尺寸

Log輸出的水平默認為trace,查詢超過500ms即為慢查詢,就要打日志,造成cpu,內(nèi)存,io負載很高,把log水平調(diào)為info或是修改配置將查詢超時時間調(diào)的長一些。

12:典型的應(yīng)用場景

es+hbase

利用兩個框架的優(yōu)點實現(xiàn)快速復雜查詢和海量數(shù)據(jù)存儲

Es+hbase:利用這兩個框架的優(yōu)點實現(xiàn)快速復雜查詢和海量數(shù)據(jù)存儲。

Es通過建立索引實現(xiàn)快速查詢,它也可以存儲但是不適合海量數(shù)據(jù)的存儲,只存儲需要那些需要從索引庫中直接返回給客戶的內(nèi)容

Hbase適合海量數(shù)據(jù)存儲,按rowkey查詢可以實現(xiàn)快速查詢,但是按列查詢效率不高,所以結(jié)合es實現(xiàn)按字段快速查詢

例如:針對海量的文章數(shù)據(jù)進行存儲和快速復雜查詢服務(wù)就可以通過es+hbase

比如文章數(shù)據(jù)有:(如果是面試題,需要問清楚需求,需要根據(jù)哪些字段進行查詢,哪些內(nèi)容直接從索引庫中直接返回給客戶,再進行下面的設(shè)置)

Es的設(shè)計:

Id:es內(nèi)置,既建立索引也存儲

Title:既建立索引也存儲

Author:不建立索引,存儲

Describe:既建立索引也存儲

Content:建立索引不存儲

Hbase的設(shè)計:

Rowkey的設(shè)計:文章的id

一個列族:info

列限定符:title,author,describe,content

13.客戶端請求過程

文檔能夠通過主要分片(Primary Shard)或者任意一個副本分片(Replica Shard)獲取。

每個步驟解釋如下:

客戶端(Client)發(fā)送一個請求到節(jié)點1。

該節(jié)點利用文檔的_id字段來判斷該文檔屬于分片0。分片0的分片拷貝(主要分片或者是副本分片)存在于所有的3個節(jié)點上。這一次,它將請求轉(zhuǎn)發(fā)到了節(jié)點2。

節(jié)點2將文檔返回給節(jié)點1,節(jié)點1隨即將文檔返回給客戶端。 對于讀請求(Read Request),

請求節(jié)點(Requesting Node)每次都會選擇一個不同的分片拷貝來實現(xiàn)負載均衡 -循環(huán)使用所有的分片拷貝。

可能存在這種情況,當一份文檔正在被索引時,該文檔在主要分片已經(jīng)就緒了,但是還未被拷貝到其他副本分片上。

此時副本分片或許報告文檔不存在(譯注:此時有讀請求來獲取該文檔),然而主要分片能夠成功返回需要的文檔 。

一旦索引請求返回給用戶的響應(yīng)是成功,那么文檔在主要分片以及所有副本分片上都是可用的。

總結(jié)

以上是生活随笔為你收集整理的ElasticSearch 知识点整理(入门)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。