Java面試題2.0--elasticsearch

歡迎關注《Java面試題2.0》合集發佈頁,持續更新中!

 

 
 
Elasticsearch是什麼?
 
Elasticsearch (ES)是一個基於Lucene構建的開源、分佈式、RESTful 接口全文搜索引擎。Elasticsearch 還是一個分佈式文檔數據庫,其中每個字段均是被索引的數據且可被搜索,它能夠擴展至數以百計的服務器存儲以及處理PB級的數據。它可以在很短的時間內在儲、搜索和分析大量的數據。它通常作爲具有複雜搜索場景情況下的核心發動機。
 
Elasticsearch就是爲高可用和可擴展而生的。可以通過購置性能更強的服務器來完成。
 
Elasticsearch的優缺點:
優點:
 橫向可擴展性:只需要增加臺服務器,做一點兒配置,啓動一下Elasticsearch就可以併入集羣。
 
分片機制提供更好的分佈性:同一個索引分成多個分片(sharding), 這點類似於HDFS的塊機制;分而治之的方式可提升處理效率。
 
高可用:提供複製( replica) 機制,一個分片可以設置多個複製,使得某臺服務器在宕機的情況下,集羣仍舊可以照常運行,並會把服務器宕機丟失的數據信息複製恢復到其他可用節點上。
 
Elasticsearch應用場景
 
大型分佈式日誌分析系統ELK  elasticsearch(存儲日誌)+logstash(收集日誌)+kibana(展示數據)
大型電商商品搜索系統、網站站內搜索、網盤搜索引擎等。
 
Elasticsearch版本控制是什麼?爲什麼要進行版本控制?
 
1.爲什麼要進行版本控制CAS無鎖
爲了保證數據在多線程操作下的準確性
 
2.悲觀鎖和樂觀鎖
悲觀鎖:假設會發生併發衝突,屏蔽一切可能違反數據準確性的操作
樂觀鎖:假設不會發生併發衝突,只在提交操作是檢查是否違反數據完整性。
 
3.內部版本控制和外部版本控制
內部版本控制:_version自增長,修改數據後,_version會自動的加1
 
外部版本控制:爲了保持_version與外部版本控制的數值一致
使用version_type=external檢查數據當前的version值是否小於請求中的version值
 
es採用的是樂觀鎖,在提交的時候,利用外部版本控制來保證多線程環境下的數據一致性
 
中文分詞器
 
因爲Elasticsearch中默認的標準分詞器分詞器對中文分詞不是很友好,會將中文詞語拆分成一個一箇中文的漢子。因此引入中文分詞器-es-ik插件
 
默認的標準分詞器會將漢字的每個字都拆成單獨的詞。
中文分詞器的詞庫也是有限的,是寫在配置文件裏的,我們可以自定義擴展詞庫,寫在配置文件裏即可
 
ES支持哪些類型?
 
基本類型
符串:string,string類型包含 text 和 keyword。
 
text:該類型被用來索引長文本,在創建索引前會將這些文本進行分詞,轉化爲詞的組合,建立索引;允許es來檢索這些詞,text類型不能用來排序和聚合。
 
keyword:該類型不需要進行分詞,可以被用來檢索過濾、排序和聚合,keyword類型自讀那隻能用本身來進行檢索(不可用text分詞後的模糊檢索)。
keyword 不會進行分詞查詢,不管是match還是term查詢,都不會進行分詞以及模糊查詢
 
9300與9200區別是什麼?
 
9300與9200區別
9300端口: ES節點之間通訊使用
9200端口: ES節點 和 外部 通訊使用
 
9300是TCP協議端口號,ES集羣之間通訊端口號
9200端口號,暴露ES RESTful接口端口號
 
什麼是DSL語言
 
es中的查詢請求有兩種方式,一種是簡易版的查詢,另外一種是使用JSON完整的請求體,叫做結構化查詢(DSL)。
由於DSL查詢更爲直觀也更爲簡易,所以大都使用這種方式。
 
DSL查詢是POST過去一個json,由於post的請求是json格式的,所以存在很多靈活性,也有很多形式。
 
Term與Match區別是什麼?
 
Term查詢不會對字段進行分詞查詢,會採用精確匹配。
Match會根據該字段的分詞器,進行分詞查詢。
 
倒排索引是什麼?
 
倒排表以字或詞爲關鍵字進行索引,表中關鍵字所對應的記錄表項記錄了出現這個字或詞的所有文檔,一個表項就是一個字表段,它記錄該文檔的ID和字符在該文檔中出現的位置情況。
 
由於每個字或詞對應的文檔數量在動態變化,所以倒排表的建立和維護都較爲複雜,但是在查詢的時候由於可以一次得到查詢關鍵字所對應的所有文檔,所以效率高於正排表。在全文檢索中,檢索的快速響應是一個最爲關鍵的性能,而索引建立由於在後臺進行,儘管效率相對低一些,但不會影響整個搜索引擎的效率。
 
ES爲什麼要實現集羣
 
在單臺ES服務器節點上,隨着業務量的發展索引文件慢慢增多,會影響到效率和內存存儲問題等。
 
我們可以採用ES集羣,將單個索引的分片到多個不同分佈式物理機器上存儲,從而可以實現高可用、容錯性等。
 
搭建軟件集羣的核心思想:
 
配置不同的節點id
配置相同的節點名稱
3臺服務器實現集羣的話,會配置三個不同的elasticsearch.yml
 
ES是如何解決高併發
 
ES是一個分佈式全文檢索框架,隱藏了複雜的處理機制,內部使用 分片機制、集羣發現、分片負載均衡請求路由。
 
Shards 分片:代表索引分片,es可以把一個完整的索引分成多個分片,這樣的好處是可以把一個大的索引拆分成多個,分佈到不同的節點上。構成分佈式搜索。分片的數量只能在索引創建前指定,並且索引創建後不能更改。
 
Replicas分片:代表索引副本,es可以設置多個索引的副本,副本的作用一是提高系統的容錯性,當某個節點某個分片損壞或丟失時可以從副本中恢復。二是提高es的查詢效率,es會自動對搜索請求進行負載均衡。當增加或修改數據的時候,只會操作主分片,然後由主分片實時同步刷新數據給副分片;當查詢的時候,會在主分片和副分片上進行負載均衡。
 
當通過增加服務器來進行擴容的時候,只需要修改Replicas的值就可以了,通過修改副分片的倍數,來實現所有服務器均攤所有數據的效果,所有的主分片和副分片加在一起的數量,應該是服務器數量的平方。因爲主分片的數量在創建之後就不能修改了,所以只能通過操縱副分片的數量來進行修改。
 
單臺ES服務器中是沒有備用分片的
 
ES集羣核心原理分析
 
1、每個索引會被分成多個分片shards進行存儲,默認創建索引是分配5個分片進行存儲,每個分片都會分佈式部署在多個不同的節點上進行部署,該分片成爲primary shards 主分片。
   
2、每一個主分片爲了實現高可用,都會有自己對應的備分分片,主分片對應的備分片不能存放同一臺服務器上,主分片可以和其他備分片存放在同一個node節點上。
 
3、查詢數據的時候,主分片和副分片都可以進行查詢,可以在所有主副分片上進行查詢操作,但做添加或修改時,只對主分片進行修改,然後由主分片實時刷新同步給副分片。
 
4、當加機器水平擴展的時候,要保證所有服務器均攤分片數量,但主分片數量又不能更改,就只能通過修改副分片的倍數來控制。保證所有的主副分片的數量之和是節點數的平方即可。
 
爲什麼主分片在創建後就不能修改?
 
documnet routing(數據路由)
 
當客戶端發起創建document的時候,es需要確定這個document放在該index哪個shard上。這個過程就是數據路由。
路由算法:shard = hash(routing) % number_of_primary_shards
如果number_of_primary_shards在查詢的時候取餘發生的變化,無法獲取到該數據
 
ES集羣相關名詞
 
Cluster:代表一個集羣,集羣中有多個節點,其中有一個爲主節點,這個主節點是可以通過選舉產生的,主從節點是對於集羣內部來說的。es的一個概念就是去中心化,字面上理解就是無中心節點,這是對於集羣外部來說的,因爲從外部來看es集羣,在邏輯上是個整體,你與任何一個節點的通信和與整個es集羣通信是等價的。
 
Shards:代表索引分片,es可以把一個完整的索引分成多個分片,這樣的好處是可以把一個大的索引拆分成多個,分佈到不同的節點上。構成分佈式搜索。分片的數量只能在索引創建前指定,並且索引創建後不能更改。
 
replicas:代表索引副本,es可以設置多個索引的副本,副本的作用一是提高系統的容錯性,當某個節點某個分片損壞或丟失時可以從副本中恢復。二是提高es的查詢效率,es會自動對搜索請求進行負載均衡。
 
Recovery:代表數據恢復或叫數據重新分佈,es在有節點加入或退出時會根據機器的負載對索引分片進行重新分配,掛掉的節點重新啓動時也會進行數據恢復。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章