正如 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 內部類 定義在方法內部的類,就是區域性內部類,只有...