ElasticSearch學習整理

 

 

對之前https://blog.csdn.net/qq_41864967/article/details/90454553 文章進行一個es寫入數據的總結,

總結:

數據先寫入內存 buffer,然後每隔 1s,將數據 refresh 到 os cache,到了 os cache 數據就能被搜索到(所以我們才說 es 從寫入到能被搜索到,中間有 1s 的延遲)。每隔 5s,將數據寫入 translog 文件(這樣如果機器宕機,內存數據全沒,最多會有 5s 的數據丟失),translog 大到一定程度,或者默認每隔30mins,會觸發 commit 操作,將緩衝區的數據都 flush 到 segment file 磁盤文件中。

數據寫入 segment file 之後,同時就建立好了倒排索引。

 

 1.刪除/更新數據底層原理

如果是刪除操作,commit 的時候會生成一個 .del 文件,裏面將某個 doc 標識爲 deleted 狀態,那麼搜索的時候根據 .del 文件就知道這個 doc 是否被刪除了。

如果是更新操作,就是將原來的 doc 標識爲 deleted 狀態,然後新寫入一條數據。

buffer 每 refresh 一次,就會產生一個 segment file,所以默認情況下是 1 秒鐘一個 segment file,這樣下來 segment file 會越來越多,此時會定期執行 merge。每次 merge 的時候,會將多個 segment file 合併成一個,同時這裏會將標識爲 deleted 的 doc 給物理刪除掉,然後將新的 segment file 寫入磁盤,這裏會寫一個 commit point,標識所有新的 segment file,然後打開 segment file 供搜索使用,同時刪除舊的 segment file。

 

2.底層 lucene

簡單來說,lucene 就是一個 jar 包,裏面包含了封裝好的各種建立倒排索引的算法代碼。我們用 Java 開發的時候,引入 lucene jar,然後基於 lucene 的 api 去開發就可以了。

通過 lucene,我們可以將已有的數據建立索引,lucene 會在本地磁盤上面,給我們組織索引的數據結構。

 

3.倒排索引

在搜索引擎中,每個文檔都有一個對應的文檔 ID,文檔內容被表示爲一系列關鍵詞的集合。例如,文檔 1 經過分詞,提取了 20 個關鍵詞,每個關鍵詞都會記錄它在文檔中出現的次數和出現位置。

那麼,倒排索引就是關鍵詞到文檔 ID 的映射,每個關鍵詞都對應着一系列的文件,這些文件中都出現了關鍵詞。

 

要注意倒排索引的兩個重要細節:

倒排索引中的所有詞項對應一個或多個文檔;

倒排索引中的詞項根據字典順序升序排列

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章