天天看點

《深入了解ElasticSearch》——3.3 使用編解碼器

本節書摘來自華章計算機《深入了解elasticsearch》一書中的第3章,第3.3節,作者:[美] 拉斐爾·酷奇(rafa ku) 馬雷克·羅戈任斯基(marek rogoziński)更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

lucene 4.0的另一個顯著變化是允許使用者改變索引檔案編碼方式。在此之前,隻能通過修改lucene核心代碼來實作。而lucene 4.0出現以後,這個不再是難題,它提供了靈活的索引方式,允許使用者改變反向索引的寫入方式。

3.3.1 簡單使用範例

讀者也許會有疑問,這個功能真的有用嗎?這個問題問得很好,為什麼使用者需要改變lucene索引寫入格式?理由之一是性能。某些字段需要特殊處理,如主鍵字段。相較于包含多個重複值的标準數值類型或文本類型而言,主鍵字段中的數值并不重複,隻要借助一些技術,主鍵值就能被快速搜尋到。使用者還可以使用simpletextcodec來調試代碼,以便了解到底是什麼格式的資料寫入了lucene索引之中(請注意,編解碼器是lucene提供的功能,elasticsearch并沒有相應的接口)。

3.3.2 工作原了解釋

假設posts索引有下面這個映射(該映射儲存在posts.json檔案中):

《深入了解ElasticSearch》——3.3 使用編解碼器

編解碼器需要逐字段配置。為了配置某個字段使用特定的編解碼器,需要在字段配置檔案中添加一個postings_format屬性,并将具體的編解碼器所對應的屬性值賦給它,例如pulsing。是以,我們需要對前面的映射檔案進行修改(該映射儲存在post_codec.json檔案中),代碼如下所示:

《深入了解ElasticSearch》——3.3 使用編解碼器

現在,執行下面的指令:

《深入了解ElasticSearch》——3.3 使用編解碼器

檢查該指令的執行結果,看看編解碼器配置是否在elasticsearch中生效,如下所示:

《深入了解ElasticSearch》——3.3 使用編解碼器
《深入了解ElasticSearch》——3.3 使用編解碼器

https://yqfile.alicdn.com/d04435cc7592bd4863c9f2c0fdc53c1832b3e2c7.png" >

正如我們所見,id字段的編解碼器類型已經變成我們所期望的那樣了。

因為編解碼器在lucene4.0以後才出現,是以elasticsearch0.90之前的版本并不支援相關功能。

3.3.3 可用的倒排表格式

我們可以使用下面這些倒排表格式。

default:當沒有顯式配置時,倒排表使用該格式。該格式提供了存儲字段(stored field)和詞項向量壓縮功能。如果想了解更多關于索引壓縮的知識。

pulsing:該編解碼器将高基(high cardinality)字段中的倒排表編碼為詞項數組,這會減少lucene在搜尋文檔時的查找操作。使用該編解碼器,可以提高在高基字段中的搜尋速度。

direct:該編解碼器在讀索引階段将詞項載入詞典,且詞項在記憶體中為未壓縮狀态。該編解碼器能提升常用字段的查詢性能,但也需要謹慎使用,由于詞項和倒排表數組都需要存儲在記憶體中,進而導緻它非常消耗記憶體。

因為詞項儲存在byte數組中,是以每個索引段最多可以使用2.1gb的記憶體來存儲這些詞項。

memory:顧名思義,該編解碼器将所有資料寫入磁盤,而在讀取時則使用fst(finite state transducers)結構直接将詞項和倒排表載入記憶體。如果想了解更多fst相關資訊。因為使用該編解碼器時,資料都在記憶體中,因而它能加速常見詞項的查詢。

bloom_default:是default編解碼器的一種擴充,即在default編解碼器處理基礎上又加入了bloom filter的處理,且bloom filter相關資料會寫入磁盤中。當讀入索引時,bloom filter相關資料會被讀入記憶體,用于快速判斷某個特定值是否存在。該編解碼器在處理主鍵之類的高基字段時非常有用。

bloom_pulsing:它是pulsing編解碼器的擴充,在pulsing編解碼器處理基礎上又加入了bloom filter的處理。

3.3.4 配置編解碼器

預設配置中提供的反向索引格式已足以應付大多數應用了,但偶爾還是需要定制反向索引格式以滿足具體的需求。這種情況下,elasticsearch允許使用者更改索引映射中的codec部分來配置編解碼器。例如,我們想配置default編解碼器,并且将其命名為custom_default,便可以通過定義下面這個映射來實作(該範例存儲在posts_codec_custom.jsonfile檔案中):

《深入了解ElasticSearch》——3.3 使用編解碼器

如你所見,我們已經更改了default編解碼器的min_block_size和max_block_size參數值,并且将新配置的編解碼器命名為custom_default。在這之後,我們對索引的name字段使用該反向索引格式。

default編解碼器屬性

當使用default編解碼器時,可以配置下面這些參數:

min_block_size:該參數确定了lucene将詞項詞典(term dictionary)中的多個詞項編碼為塊(block)時,塊中的最小詞項數。預設值為25。

max_block_size:該參數确定了lucene将詞項詞典(term dictionary)中的多個詞項編碼為塊(block)時,塊中的最大詞項數。預設值為48。

direct編解碼器屬性

當使用direct編解碼器時,可以配置下面這些參數:

min_skip_count:該參數确定了允許寫入跳表(skip list)指針的具有相同字首的詞項的最小數量。預設值為8。

low_freq_cutoff:編解碼器使用單個數組對象來存儲那些文檔頻率(document frequence)低于該參數值的詞項的倒排鍊及位置資訊。預設值為32。

memory編解碼器屬性

當使用memory編解碼器時,可以配置下面這些參數:

pack_fst:該參數為布爾類型,預設設定為false,用來确認儲存倒排鍊的記憶體結構是否被打包為fst(finite state transducers)類型。而打包為fst類型能減少儲存資料所需的記憶體量。

acceptable_overhead_ratio:該參數為浮點型,指定了内部結構的壓縮率,預設值為0.2。當該參數值為0時,雖然沒有額外的記憶體消耗,但是這種實作方式會導緻較低的性能。當該參數值為0.5時,将會多付出50%的記憶體消耗,但是這種實作方式能提升性能。參數值超過1的設定也是可行的,隻是會導緻更多的記憶體開銷。

pulsing編解碼器屬性

當使用pulsing編解碼器時,除了可以設定default編解碼器的那些參數,還有另外一個參數可供配置,請參考下面的描述:

freq_cut_off:該參數預設設定為1,是設定的一個文檔頻率門檻值,若詞項對應的文檔頻率小于等于該門檻值,則将該詞項的倒排鍊寫入詞典中。

基于bloom filter的編解碼器屬性

如果要配置基于bloom filter的編解碼器,可使用bloom_filter類型并設定下面這些屬性:

delegate:該屬性值用來确定将要被bloom filter包裝(wrap)的編解碼器。

ffp:該屬性值介于0與1.0之間,用來确定期望的假陽率(false positive probability)。我們可以依據每個索引段中的文檔數設定多個ffp值。例如,預設情況下,10k個文檔時為0.01,1m個文檔時為0.03。這種配置的含義是:當索引段中文檔數大于10 000個時,ffp值使用0.01,而當文檔數超過1 000 000時,ffp值使用0.03。

例如,我們想在direct編解碼器上包裝基于bloom filter的編解碼器(範例存儲在posts_bloom_custom.json檔案中):

《深入了解ElasticSearch》——3.3 使用編解碼器

https://yqfile.alicdn.com/643e63a77e8c5f42fe4bba349e61c4691aa70e2d.png" >

繼續閱讀