ElasticSearch核心概念和原理
ES核心概念和原理
ElasticSearch作為目前比較流行的企業級搜索引擎框架,在面試和工作的比重越來越大,掌握ES將會讓你去大廠面試的成功率大大提高,因此筆者將從ES的使用到ES核心原理到核心源碼,逐步講解深入剖析,從概念到代碼的實現都盡量解釋的清楚,那么最后將會做一個完整的搜索引擎項目,當然因作者能力有限,難免有錯誤之處,煩請指正,謝謝
1、什么是搜索:
早期的搜索引擎是把因特網中的資源服務器的地址收集起來,由其提供的資源的類型不同而分成不同的目錄,再一層層地進行分類。人們要找自己想要的信息可按他們的分類一層層進入,就能最后到達目的地,找到自己想要的信息。這其實是最原始的方式,只適用於因特網信息並不多的時候。隨着因特網信息按幾何式增長,出現了真正意義上的搜索引擎,這些搜索引擎知道網站上每一頁的開始,隨后搜索因特網上的所有超級鏈接,把代表超級鏈接的所有詞匯放入一個數據庫。這就是搜索引擎的原型。
搜索:通過一個關鍵詞或一段描述,得到你想要的(相關度高)結果。
2、如何實現搜索功能?
可以使用關系型數據庫來進行處理,例如MySQL,但是同樣會有很多的問題讓我們不得不去考慮其他實現方式,比如性能差、不可靠、結果不准確(相關度低)
3、倒排索引、Lucene和全文檢索?
倒排索引
What is it?
首先我們看看數據庫中的索引分布。
ok,這是我們數據庫索引的一張表,我們看到有三種手機,小米手機、小米NFC手機、紅米手機,按照id1、2、3來進行排列
在這張圖里,小米出現的次數是在id為1、2之中,手機在123中均出現,NFC和紅米也如此排列,這就是倒排索引
那么在我們的select * from product where brand like '%小米 NFC 智能 手機'
之中,小米、手機、NFC是會被匹配到的。小米手機在我們匹配到的結果中是出現了2次,小米NFC手機出現了3次...后面的依次按照該規律進行排列。匹配數字其實就是我們所謂的相關度,那么小米NFC手機出現了3次,那么它的相關度就是3,是最大的,那么就可能是我們最想要的結果,即這就是倒排索引最簡單的一個demo,那么以后我們會對其進行更深入的講解,目前了解有個認識即可。
數據結構:
- 包含這個關鍵詞的document list (理解為表中一行)
- 關鍵詞在每個doc中出現的次數 TF term frequency
- 關鍵詞在整個索引中出現的次數 IDF inverse doc frequency
- 關鍵詞在當前doc中出現的次數
- 每個doc的長度,越長相關度越低
- 包含這個關鍵詞的所有doc的平均長度
Lucene:
就是一個jar包,幫我們創建倒排索引,提供了復雜的API
Lucene集群問題
如果用Lucene做集群實現搜索,會有那些問題?
① 節點一旦宕機,節點數據丟失,后果不堪設想,可用性差。
② 自己維護,麻煩(自己創建管理索引),單台節點的承載請求的能力是有限的,需要人工做負載(雨露均沾)。
4、Elasticsearch
分布式、高性能、高可用、可伸縮、易維護
But!! ES≠搜索引擎
(1) 分布式
分布式的搜索,存儲和數據分析引擎:
(2) 優點:
① 面向開發者友好,屏蔽了Lucene的復雜特性,集群自動發現(cluster discovery)
② 自動維護數據在多個節點上的建立
③ 會幫我做搜索請求的負載均衡
④ 自動維護冗余副本,保證了部分節點宕機的情況下仍然不會有任何數據丟失
⑤ ES基於Lucene提供了很多高級功能:復合查詢、聚合分析、基於地理位置等。
⑥ 對於大公司,可以構建幾百台服務器的大型分布式集群,處理PB級別數據;對於小公司,開箱即用,門檻低上手簡單。
⑦ 相遇傳統數據庫,提供了全文檢索,同義詞處理(美麗的cls>漂亮的cls),相關度排名。聚合分析以及海量數據的近實時(NTR)處理,這些傳統數據庫完全做不到。
(3) 應用領域:
① 百度(全文檢索、高亮、搜索推薦)
② 各大網站的用戶行為日志(用戶點擊、瀏覽、收藏、評論)
③ BI(Business Intelligence商業智能),數據分析:數據挖掘統計。
④ Github:代碼托管平台,幾千億行代碼
⑤ ELK:Elasticsearch(數據存儲)、Logstash(日志采集)、Kibana(可視化)
5、ES核心概念:
(1) cluster(集群):每個集群至少包含兩個節點.
(2) node:集群中的每個節點,一個節點不代表一台服務器
(3) field:一個數據字段,與index和type一起,可以定位一個doc
(4) document:ES最小的數據單元 Json
{
"id": "1",
"name": "小米",
"price": {
"標准版": 3999,
"尊享版": 4999,
"吳磊簽名定制版": 19999
}
}
Type:邏輯上的數據分類,es 7.x中刪除了type的概念
Index:一類相同或者類似的doc,比如一個員工索引,商品索引。
6.Shard分片:
1:一個index包含多個Shard,默認5P,默認每個P分配一個R,P的數量在創建索引的時候設置,如果想修改,需要重建索引。
2:每個Shard都是一個Lucene實例,有完整的創建索引的處理請求能力。
3:ES會自動在nodes上為我們做shard 均衡。
4:一個doc是不可能同時存在於多個PShard中的,但是可以存在於多個RShard中。
5: P和對應的R不能同時存在於同一個節點,所以最低的可用配置是兩個節點,互為主備。
分片