一、Elastic Search概述:
1.1 Elastic Search 簡介
Elastic Search(ES)是一個基于Lucene構建的開源、分布式、RESTFul接口全文搜索引擎。ES還是一個分布式文檔庫,其中每個字段均是被索引的 數據且可被搜索,它能夠擴展至數以百計的服務器存貯以及處理PB級的數據,它可以在短時間內存儲、搜索和分析大量的數據。
Elastic Search的主要特點
1.橫向可擴展性。增加一臺機器,只需要添加集群配置,啟動Elastic Search進行即可;
2.分片機制。一個索引可以分成多個Sharding,提高處理效率;
3.高可用性。每個分片可以設置多個備份,少量機器宕機不影響正常使用;
1.1 Lucene簡介
Lucene是Apache軟件基金會中的一個開源代碼的全文搜索引擎工具包,方便實現全文檢索的功能。 Lucene是倒敘排序索引,即由屬性的值來確定記錄的位置,而不是由記錄來確定屬性值。
舉例(轉自:《Elasticsearch技術解析與實戰》):
字典樹采取trie樹和DAT樹,這部分待完善...
1.2 Lucene的核心結構:
Lucene將上面的三列分別作為詞典文件(Term Dictionary)、頻率文件(frequencies)、位置文件(positions)保存,其中詞典文件保存了指向頻率文件和文件位置的指針,通過指針可以找到該關鍵字的頻率信息和位置信息。
總結socre評分有如下四個原則:
1.搜索詞出現次數越多,得分越高;
2.搜索詞在整個索引中出現次數越少,得分越高;
3.搜索字段中所有詞語數量越少,得分越高;
4.搜索詞和中的某一條數據匹配字段越多,得分越高。
1.3 ES的的術語說明:
Elastic Search和mysql的對應關系
MySql | Elastic Search |
---|---|
database | index |
table | type |
row | document |
cloumn | field |
schema | mapping |
index | Everything is indexed |
SQL | query DSL |
slect * from... | get http://... |
update talbe set... | put http://... |
二.集群內部結構
ES是主從模式設計
2.1 主節點(Master node)
主節點負責集群的相關操作,管理集群變更,且全局唯一,一般采用主節點和數據節點分離的部署架構。為防止數據丟失,每個主節點要知道哪些從節點有資格成為主節點的數量。
2.2 數據節點(Data node)
負責保存數據,執行數據相關的操作,一般情況下(特殊除外),數據讀寫只和數據節點交互,不會和主節點打交道。
當增加和刪除節點時,即水平擴容,會觸發rebalance操作。
數據的路由:
shard = hash(routing) % primary_shard_count
routing默認值是document_id的
2.3 預處理節點(ingest node,5.0版本引入)
在索引寫入數據之前,通過事先定義好的processors和pipeline,對數據進行轉換、富化。processors和pipeline攔截bulk和index請求,在應用相關操作后,將文檔傳回給index或bulk API。
2.4 協調節點(Coordinating node)
協調節點將請求轉發給Data node,每個Data node在本地執行請求,并返回給協調節點,協調節點將每個Data node的結果收集、合并甚至排序為單個全局結果,因此協調節點需要較多的CPU和內存資源。
數據寫入過程:
數據寫入的consistency參數:
quorum(默認):
要求大部分的shard是活躍的,那么寫入操作可執行。
quorum = int((primary_count+number_of_replica) /2 ) + 1
當quorum個數不夠時,默認等待一分鐘,如果一分鐘內quorum個數仍然不夠才不再執行。
one:
只要有一個primary shard是活躍的,那么寫入操作可執行。
all:
當所有shard是活躍的(primary shard + replica shard),那么寫入操作才可執行。
數據查詢的timeout參數:
timeout機制,指定每個shard只能在timeout時間內(默認無timeout限制),將檢索到的結果(可能只有一部分)返回給client,而不是等所有查詢結果全部搜索出來再返回,避免搜索時間過長,影響用戶體驗。