影響Lucene索引速度原因以及提高索引速度技巧

2022-05-09 18:57:49 字數 2267 閱讀 1701

在網上看了一篇外文文章,裡面介紹了提高lucene索引速度的技巧,分享給大家。

先來看下影響索引的主要因素:

maxmergedocs

該引數決定寫入記憶體索引文件個數,到達該數目後就把該記憶體索引寫入硬碟,生成乙個新的索引segment檔案。

所以該引數也就是乙個記憶體buffer,一般來說越大索引速度越快。

maxbuffereddocs這個引數預設是disabled的,因為lucene中還用另外乙個引數(rambuffersizemb)控制這個bufffer的索引文件個數。

其實maxbuffereddocs和rambuffersizemb這兩個引數是可以一起使用的,一起使用時只要有乙個觸發條件滿足就寫入硬碟,生成乙個新的索引segment檔案。

rambuffersizemb

控制用於buffer索引文件的記憶體上限,如果buffer的索引文件個數到達該上限就寫入硬碟。當然,一般來說也只越大索引速度越快。

當我們對文件大小不太確定時,這個引數就相當有用,不至於outofmemory error.

mergefactor

這個引數是用於子索引(segment)合併的。

lucene中索引總體上是這樣進行,索引現寫到記憶體,觸發一定限制條件後寫入硬碟,生成乙個獨立的子索引-lucene中叫segment。一般來說這些子索引需要合併成乙個索引,也就是optimize(),否則會影響檢索速度,而且也可能導致open too many files。

mergefactor 這個引數就是控制當硬碟中有多少個子索引segments,我們就需要現把這些索引合併衝乙個稍微大些的索引了。

mergefactor這個不能設定太大,特別是當maxbuffereddocs比較小時(segment 越多),否則會導致open too many files錯誤,甚至導致虛擬機器外面出錯。

note: lucene 中預設索引合併機制並不是兩兩合併,好像是多個segment 合併成最終的乙個大索引,所以mergefactor越大耗費記憶體越多,索引速度也會快些,但我的感覺太大譬如300,最後合併的時候還是很滿。batch indexing 應 mergefactor>10

加快索引的一些技巧:

• 確認你在使用最新的lucene版本。

• 盡量使用本地檔案系統

遠端檔案系統一般來說都會降低索引速度。如果索引必須分布在遠端伺服器,請嘗試先在本地生成索引,然後分發到遠端伺服器上。

• 使用更快的硬體裝置,特別是更快的io裝置

• 在索引期間復用單一的indexwriter例項

• 使用按照記憶體消耗flush代替根據文件數量flush

在lucene 2.2之前的版本,可以在每次新增文件後呼叫ramsizeinbytes方法,當索引消耗過多的記憶體時,然後在呼叫flush()方法。這樣做在索引大量小文件或者文件大小不定的情況下尤為有效。你必須先把maxbuffereddocs引數設定足夠大,以防止writer基於文件數量flush。但是注意,別把這個值設定的太大,否則你將遭遇lucene-845號bug。不過這個bug已經在2.3版本中得到解決。

在lucene2.3之後的版本。indexwriter可以自動的根據記憶體消耗呼叫flush()。你可以通過writer.setrambuffersizemb()來設定快取大小。當你打算按照記憶體大小flush後,確保沒有在別的地方設定maxbuffereddocs值。否則flush條件將變的不確定(誰先符合條件就按照誰)。

• 在你能承受的範圍內使用更多的記憶體

在flush前使用更多的記憶體意味著lucene將在索引時生成更大的segment,也意味著合併次數也隨之減少。在lucene-843中測試,大概48mb記憶體可能是乙個比較合適的值。但是,你的程式可能會是另外乙個值。這跟不同的機器也有一定的關係,請自己多加測試,選擇乙個權衡值。

• 關閉復合檔案格式

呼叫setusecompoundfile(false)可以關閉復合檔案選項。生成復合檔案將消耗更多的時間(經過lucene-888測試,大概會增加7%-33%的時間)。但是請注意,這樣做將大大的增加搜尋和索引使用的檔案控制代碼的數量。如果合併因子也很大的話,你可能會出現用光檔案控制代碼的情況。

• 重用document和field例項

在lucene 2.3中,新增了乙個叫setvalue的方法,可以允許你改變欄位的值。這樣的好處是你可以在整個索引程序中復用乙個filed例項。這將極大的減少gc負擔。

最好建立乙個單一的document例項,然後新增你想要的字段到文件中。同時復用新增到文件的field例項,通用呼叫相應的setvalue方法改變相應的字段的值。然後重新將document新增到索引中。

建立索引後,速度變快原因 以及索引失效總結

總結自韓順平老師教學 速度變快是因為搜尋引擎的選擇,一般是btree,二叉樹的話是logn的時間複雜度 索引失效的總結。以下是具體描述。原理示意圖 索引使用的注意事項 索引的代價 占用磁碟空間 對dml操作有影響,變慢 在哪些列上適合新增索引?總結 滿足以下條件的字段,才應該建立索引.a 肯定在wh...

利用SQL索引提高查詢速度

1.合理使用索引 索引是資料庫中重要的資料結構,它的根本目的就是為了提高查詢效率。現在大多數的資料庫產品都採用ibm最先提出的isam索引結構。索引的使用要恰到好處,其使用原則如下 field3上沒有索引的情況下 對a作全表掃瞄,結果排序 對b作全表掃瞄,結果排序 結果合併。對於很小的表或巨大的表比...

為什麼索引可以提高查詢速度

參考 以下是關於索引的個人理解 有這麼乙個students表 我們執行一條sql語句 select from students where name 老頑童 執行結果 如果我們沒有為name欄位建立索引,這條sql語句是從頭開始一條一條比較的,比較七次 找到了老頑童所在的這一條資料。如果此時我們為n...