參考:
es官方文件分片內部原理:
es分片原理:
索引的解釋:
名詞的索引:指的是由多個分片組成的集合,類似於資料庫中的資料庫名稱
動詞的索引:es文件儲存的過程
1.倒排索引
為了快速的全文檢索,elasticsearch使用了倒排索引的結構,使用分析器將每篇文件的字段中的內容分詞(每乙個詞稱為term或tokens),建立了乙個包含所有不重複詞條的列表,從列表中可以找到某個詞條出現過的文件,假如有兩個文件:
quick brown
quick brown foxes
term doc1 doc2
quick x
brown x x
foxes x
quick x
假如搜尋quick brown,可以從倒排索引結構中看到quick在文件1出現過,brown在文件1和文件2都出現過,因此將文件1和文件2返回即可。
想深入了解的可參考:
時間序列資料庫的秘密(2)——索引
2.倒排索引的不變性
倒排索引寫入磁碟後是不可改變的,也就是不能修改它,既然不可修改,那麼新增文件的時候就需要重新建索引,但是如果每次新增文件就重建索引,這樣的效能消耗是很大的,接下來看一下elasticsearch是如何解決這個問題的。
3.動態更新索引
首先介紹一下lucene中的segment(段):
乙個lucene索引(注意是lucene索引,不是elasticsearch索引)由多個段和提交點組成,段可以看做是乙個倒排索引,提交點記錄了所有可用的段,通過提交點就可以獲取所有可用的段,然後在段上做查詢。
如下圖所示,乙個lucene索引,包含了三個段和乙個提交點,通過提交點,使三個段變得可被查詢:
lucene索引和elasticsearch索引的區別:
lucene索引在elasticsearch 稱為分片,在elasticsearch中一般會為乙個索引建多個分片,elasticsearch的索引是由多個分片組成的,那麼es索引和lucene索引的關係如下:
知道了段的概念,就可以理解elasticsearch如何保留倒排索引不變的情況下實現倒排索引的更新,它是通過增加新的段來更新索引,而不是對整個倒排索引重寫。
流程:(1)新增的文件首先進入到記憶體快取中
(2)預設的情況下,1s重新整理一次,將記憶體中的文件寫入段中,這個過程稱為refresh
(3)段被寫入檔案系統快取中,es會定時的將段寫入磁碟中,同時生成新的提交點,記錄所有可用的段,這個過程稱為flush
(4)新的段被開啟,讓它包含的文件可以被搜尋
(5)記憶體快取被清空,準備接收新的文件
4.文件的刪除和更新
由於段是不可變的,既然插入的時候是通過新增段來實現,那麼刪除和更新的時候是如何做的?
提交點除了記錄可用的段之外,還包含了乙個.del檔案,檔案中列出被刪除文件的段資訊,當乙個文件被刪除時,實際上只是在.del檔案中被記錄了下來,它還可以被搜尋到,只是在返回結果前將該文件從結果集中移除了。文件更新也是類似的方式。
.del中記錄的文件將在段合併的時候被清除。
5.近實時搜尋
由於將段寫入磁碟中的代價比較高,但是段被寫入檔案系統快取的代價比較低,如果利用這個特性,當段被寫入檔案系統快取時就變得可搜尋,就能解決寫入磁碟的效能問題,減少文件索引到可被搜尋的時間,更接近實時搜尋。
新增文件進入記憶體快取區:
記憶體快取區中的文件被refresh到段中,如下圖所示,此時新的段雖然未被寫入磁碟,但是此時已經可以開啟,變的可被搜尋,這就是elasticsearch近實時搜尋的原理,文件的變化不是立即對搜尋可見,但是會在一秒之內(refresh預設1s重新整理一次)變得可見:
.段合併
由於refresh將文件寫入段中,會導致段的數量不斷增多,而每乙個段都會消耗檔案控制代碼、記憶體和cpu執行週期,每個搜尋請求也會輪詢每個段查詢是否包含需要的文件,段數量的增多將會導致搜尋時間的加長。
elsticsearch通過在後台使用段合併來解決這個問題,合併程序會選擇一部分大小相似的段將它們合併到更大的段中而不會影響搜尋。
在段合併的過程中也會將.del檔案中記錄的文件刪除,從而實現真正意義上的刪除。
下圖將兩個已提交的段和乙個未提交的段合併到了乙個更大的段:
合併結束後,老的段被刪除,新的段被flush到磁碟,提交點內記錄了新的段,排除舊的段:
需要注意的是段合併需要消耗大量的i/o和cpu資源,因此elasticsearch在預設情況下對合併流程進行了資源限制。
也可以通過optimize
api強制合併段。
ElasticSearch 檢索文件
現在elasticsearch中已經儲存了一些資料,我們可以根據業務需求開始工作了。第乙個需求是能夠檢索單個員工的資訊。這對於elasticsearch來說非常簡單。我們只要執行http get請求並指出文件的 位址 索引 型別和id既可。根據這三部分資訊,我們就可以返回原始json文件 檢索命令如...
Elasticsearch 文件操作
1.elasticserach api 操作 elasticsearch rest api遵循的格式為 curl x 檢查es版本資訊 http ip 9200 檢視集群是否健康 http ip 9200 cat health?v 檢視節點列表 http ip 9200 cat nodes?v 列出...
ElasticSearch 文件儲存
確定shard的公式 shard hash routing number of primary shardsrouting 預設是文件的 id 也可以設定成乙個自定義的值。因此要在建立索引的時候就確定好主分片的數量,並且永遠不會改變這個數量,因為如果數量變化了,那麼所有之前路由的值都會無效。每個節點...