您好,登錄后才能下訂單哦!
????Doc Values 是什么
其實大部分 NoSQL
在創建多個索引的時候也采用這種方式,就是再使用另一種方式存儲一份文本,使得可以增強搜索。 Docvalues
通過轉置兩者間的關系來解決這個問題。倒排索引將詞項映射到包含它們的文檔, Docvalues
將文檔映射到它們包含的詞項:
Doc??????Terms-----------------------------------------------------------------Doc_1?|?brown,?dog,?fox,?jumped,?lazy,?over,?quick,?the Doc_2?|?brown,?dogs,?foxes,?in,?lazy,?leap,?over,?quick,?summer Doc_3?|?dog,?dogs,?fox,?jumped,?over,?quick,?the-----------------------------------------------------------------
當數據被轉置之后,想要收集到每個文檔行,獲取所有的詞項就非常簡單了。所以搜索使用倒排索引查找文檔,聚合操作收集和聚合 DocValues
里的數據,這就是 ElasticSearch
。
DocValues
是在索引時與倒排索引同時生成。也就是說 DocValues
和 倒排索引
一樣,基于 Segement
生成并且是不可變的。同時 DocValues
和 倒排索引
一樣序列化到磁盤,這樣對性能和擴展性有很大幫助。
DocValues
通過序列化把數據結構持久化到磁盤,我們可以充分利用操作系統的內存,而不是 JVM
的 Heap
。 當 workingset
遠小于系統的可用內存,系統會自動將 DocValues
保存在內存中,使得其讀寫十分高速; 不過,當其遠大于可用內存時,操作系統會自動把 DocValues
寫入磁盤。很顯然,這樣性能會比在內存中差很多,但是它的大小就不再局限于服務器的內存了。如果是使用 JVM
的 Heap
來實現那么只能是因為 OutOfMemory
導致程序崩潰了。
?????Doc Values 壓縮
從廣義來說, DocValues
本質上是一個序列化的 列式存儲,這個結構非常適用于聚合、排序、腳本等操作。而且,這種存儲方式也非常便于壓縮,特別是數字類型。這樣可以減少磁盤空間并且提高訪問速度。下面來看一組數字類型的 DocValues
:
Doc??????Terms??----------------------------------------------------------------- ??Doc_1?|?100 ??Doc_2?|?1000 ??Doc_3?|?1500 ??Doc_4?|?1200 ??Doc_5?|?300 ??Doc_6?|?1900 ??Doc_7?|?4200 ??-----------------------------------------------------------------
你會注意到這里每個數字都是 100 的倍數, DocValues
會檢測一個段里面的所有數值,并使用一個 最大公約數 ,方便做進一步的數據壓縮。我們可以對每個數字都除以 100,然后得到: [1,10,15,12,3,19,42]
。現在這些數字變小了,只需要很少的位就可以存儲下,也減少了磁盤存放的大小。
DocValues
在壓縮過程中使用如下技巧。它會按依次檢測以下壓縮模式:
如果所有的數值各不相同(或缺失),設置一個標記并記錄這些值
如果這些值小于 256,將使用一個簡單的編碼表
如果這些值大于 256,檢測是否存在一個最大公約數
如果沒有存在最大公約數,從最小的數值開始,統一計算偏移量進行編碼
當然如果存儲 String
類型,其一樣可以通過順序表對 String
類型進行數字編碼,然后再把數字類型構建 DocValues
。
????????禁用 Doc Values
DocValues
默認對所有字段啟用,除了 analyzed strings
。也就是說所有的數字、地理坐標、日期、IP 和不分析( not_analyzed
)字符類型都會默認開啟。
analyzed strings
暫時還不能使用 DocValues
,是因為經過分析以后的文本會生成大量的 Token
,這樣非常影響性能。
雖然 DocValues
非常好用,但是如果你存儲的數據確實不需要這個特性,就不如禁用他,這樣不僅節省磁盤空間,也許會提升索引的速度。
要禁用 DocValues
,在字段的映射(mapping)設置 doc_values:false
即可。例如,這里我們創建了一個新的索引,字段 "session_id"
禁用了 DocValues
:
PUT?my_index{ ??"mappings":?{ ????"my_type":?{ ??????"properties":?{ ????????"session_id":?{ ??????????"type":???????"string", ??????????"index":??????"not_analyzed", ??????????"doc_values":?false? ????????} ??????} ????} ??}}
通過設置 doc_values:false
,這個字段將不能被用于聚合、排序以及腳本操作
同樣可以禁用倒排索引,使它不能被正常搜索,但是可以排序,例如:
PUT?my_index{ ??"mappings":?{ ????"my_type":?{ ??????"properties":?{ ????????"customer_token":?{ ??????????"type":???????"string", ??????????"index":??????"not_analyzed", ??????????"doc_values":?true,? ??????????"index":?"no"? ????????} ??????} ????} ??}}
通過設置 doc_values:true
和 index:no
,我們得到一個只能被用于聚合/排序/腳本的字段。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。