Elasticsearch 內部資料結構深度解讀

2021-10-17 19:34:25 字數 4487 閱讀 4848

正如 elastic 官方文件所說:

elasticsearch 特點之一是:分布式文件儲存。

elasticsearch不會將資訊儲存為類似列資料庫的行(row),而是儲存為已序列化為json文件的複雜資料結構。

當集群中有多個elasticsearch節點時,儲存的文件會分布在整個集群中,並且可以從任何節點立即訪問。

儲存文件後,將在1秒鐘內(預設重新整理頻率為1s)幾乎實時地對其進行索引和完全搜尋。

如何做到快速索引和全文檢索的呢?

elasticsearch使用倒排索引的資料結構,該結構支援非常快速的全文本搜尋。

倒排索引列出了出現在任何文件中的每個唯一單詞,並標識了每個單詞出現的所有文件。

索引可以認為是文件的優化集合,每個文件都是字段的集合,這些欄位是包含資料的鍵值對。

預設情況下,elasticsearch 對每個欄位中的所有資料建立索引,並且每個索引欄位都具有專用的優化資料結構。

例如,文字字段儲存在倒排索引中,數字欄位和地理字段儲存在bkd樹中。

資料型別

資料結構

text/keyword

倒排索引

數字/地理位置

bkd樹

不同字段具有屬於自己字段型別的特定優化資料結構,並具備快速響應返回搜尋結果的能力使得 elasticsearch 搜尋飛快!

2.1 倒排索引定義

面對海量內容,如何快速的找到包含使用者查詢詞的內容,倒排索引扮演了關鍵角色。倒排索引是單詞到文件對映關係的最佳實現形式。

2.2 倒排索引示例

官方文件的示例

假設我們有兩個文件,每個文件的 content 域包含如下內容:

- 1、the quick brown fox jumped over the lazy dog

- 2、quick brown foxes leap over lazy dogs in summer

資料索引化制約因素:分詞器 analyzer 的選型。

倒排索引(基於 預設standard 標準分詞器分詞)如下所示:

term

doc_1

doc_2

quick

xthe

xbrownxx

dogx

dogs

xfox

xfoxesxin

xjumped

xlazyxx

leap

xoverxx

quick

xsummer

xthe

x如上所示,對於文件中的每個詞,都包含了其所在文件的列表。

2.3 倒排索引特點

2.4 倒排索引適用場景3.1 doc values 定義

在 elasticsearch 中,doc values 就是一種列式儲存結構,預設情況下每個欄位的 doc values 都是啟用的(除了 text 型別),doc values 是在索引時建立的,當欄位索引時,elasticsearch 為了能夠快速檢索,會把字段的值加入倒排索引中,同時它也會儲存該字段的 doc values。

區別於倒排索引的定義,doc values 被定義為:「正排索引」。

3.2 doc values 示例

仍然 以 1.2 文件為例,doc values 結構如下所示(僅做舉例):

docterms

doc_1

brown, dog, fox, jumped, lazy, over, quick, the

doc_2

brown, dogs, foxes, in, lazy, leap, over, quick, summer

doc values 通過轉置兩者間的關係來解決適用倒排索引聚合效率低、難以擴充套件的問題。

對比可以看出:

倒排索引詞項對映到包含它們的文件doc values文件對映到它們包含的詞項

3.3 doc values 特點

3.4 doc values 適用場景

elasticsearch 中的 doc values 常被應用到以下場景:

注意:

因為文件值被序列化到磁碟,我們可以依靠作業系統的幫助來快速訪問。

當 工作集(working set) 遠小於節點的可用記憶體,系統會自動將所有的文件值儲存在記憶體中,使得其讀寫十分高速;

當其遠大於可用記憶體,作業系統會自動把 doc values 載入到系統的頁快取中,從而避免了 jvm 堆記憶體溢位異常。

3. 5 doc values 使用注意事項

對於不需要:排序、聚合、指令碼計算、地理位置過濾的業務場景,可以考慮禁用:doc values,以節約儲存。

put my_index}}}

4.1 fielddata 定義

如前所述:

text 型別欄位是不支援 doc values正排索引的,text欄位使用的是:查詢時建立的基於的記憶體資料結構(query-time in-memory data structure) fielddata。fielddata 將 text 字段用於聚合、排序或在指令碼中使用時,將按需構建此資料結構。

實現機理:

它是通過從磁碟讀取每個段的整個倒排索引,反轉詞項↔︎文件關係並將結果儲存在jvm堆中的記憶體中來構建的。

4.2 fielddata 示例

嚴格意義講,3.2 的示例,放到這裡會更合適。

delete test_001

put test_001}}}

post test_001/_bulk}}

get test_001/_search

},"aggs": }}}

4.3 fielddata 特點

4.4 fielddata 適用場景

4.5 fielddata 使用注意事項5.1 _source 定義

_source 字段包含儲存文件的原始資料(json格式)。_source 字段本身未構建索引(因此不可搜尋),但已儲存該欄位,以便在執行獲取請求(如get或search)時可以將其返回。

5.2 _source 使用注意事項

儘管非常方便,但是source欄位確實會導致索引內的儲存開銷。因此,可以將其禁用。

put my-index-000001

}}

禁用前要做好以下衡量 禁用 _source 後,如下操作將不可用:

所以,要在儲存空間、業務場景之間權衡利弊後選型。

6.1 store 定義

預設情況下,對字段值進行索引以使其可搜尋(第1節的 倒排索引),但不儲存它們。這意味著可以查詢該欄位,但是無法檢索原始字段值。通常這無關緊要。該字段值已經是_source欄位的一部分,預設情況下已儲存。

但是,在某些特殊場景下,如果你只想檢索單個欄位或幾個欄位的值,而不是整個_source的值,則可以使用source filter來實現。

這個時候, store 就派上用場了。

6.2 store 示例

delete news-000001

put news-000001

, "properties": ,

"date": ,

"content": }}}

put news-000001/_doc/1

get news-000001/_search

get news-000001/_search

6.3 store 適用場景

如 6.2 示例,在某些情況下,儲存字段可能很有意義。例如,採集的新聞資料是:帶有標題、日期和很大內容欄位的文件,則可能只想檢索標題和日期,而不必從較大的_source欄位中提取這些字段。

看完本文後,doc values , field data , store fields 就非常清晰了。

字段型別不一樣,儲存不一樣。

預設:倒排索引預設所有欄位都啟用,正排索引 doc values 非 text 型別預設啟用, source (儲存原始文件的 所有欄位的 json 結構資料)和 store (儲存指定欄位的 json 資料) 的啟用與否需要結合業務實際。假設:正排索引、倒排索引、_source 、store 都啟用了,儲存肯定會增加,但不是線性的 4倍。

ElasticSearch集群內部原理

分布式系統的集群方式可以分為主從和無主模式。主從模式通過將mater作為權威節點,將操作分工,維護集群元資訊簡化系統設計,但是存在單點故障的問題。主節點管理集群層面相關的相關操作。一般不作為資料節點,盡量做少量的工作。為避免出現腦裂問題 網路分割槽時出現多主 的情況,配置discovery.zen....

elasticsearch內部原理自我總結

elasticsearch 5.5 對於elasticsearch我自己也是新手,只是想做點筆記,記錄下自己的理解。我一直想明白當乙個文件被索引進elasticsearch時,其內部幹什麼了?本人結合網上的教程,記錄下 乙個新文件要使其可見,需要使用倒排索引,其長相如下 詞項文件1 文件2文件3 中...

內部類 成員內部類 區域性內部類 匿名內部類

public class 外部類 private int num 0 外部類如果要訪問內部類的成員,則需要通過內部類的物件訪問 使用方式 1.外部類使用內部類,主函式再使用外部類 2.通過new的方式 外部類.內部類 物件名 new 外部類 new 內部類 定義在方法內部的類,就是區域性內部類,只有...