Lucene.Net:关于索引的一些补充说明和总结
在前面的幾篇關于lucene的文章中,我已經簡要說明了如何利用lucene進行分詞、索引和搜索。最近大部分時間耗在查資料上,看得比較多比較雜但是一貫的不夠深入,還好多數都是不會影響編程實踐的概念性的東西。有時候我自己也感覺到有心無力,太關注那些表面的繁文縟節性的東西有讓人失掉好奇、激情和勤奮實踐的風險,畢竟我個人需要專心專注的事情是解決問題而不是多知道幾個概念和專業名詞,要先做出東西來,雖然這樣顯得不是很專業。本文簡單補充記錄一下對于lucene創建索引有用的幾個參數以及索引文件中的常見的幾種格式的感性認識和總結,希望對你也有幫助。
一、提高索引速度幾個有用的參數
在索引算法確定的情況下,最為影響lucene索引速度的主要是三個參數,即IndexWriter中的 mergeFactor, maxMergeDocs和RAMBufferSizeMB 。這些參數主要就是控制內外存交換和索引合并頻率,從而達到提高索引速度的目的,當然這幾個參數的具體設定和機器的硬件條件也密不可分。
1、mergeFactor
mergeFactor就是所謂的“合并因子”,它的作用主要是用于子索引(segment)合并的。 如你所知,lucene中索引總體上是這樣進行的:索引先寫入內存,觸發一定限制條件后寫入硬盤,生成一個獨立的子索引(segment)。通常情況下,多個子索引在優化(optimize())后會合并成一個索引,否則子索引會很多,影響檢索速度,而且占用的磁盤空間可能會非常大。mergeFactor這個參數就是控制當硬盤中有多少個子索引segments時,lucene就需要把這些子索引合并成一個較大一點的索引。合并的內部實現細節我也不是很清楚,但是lucene 中默認索引合并機制并不是兩兩合并,通常都是多個segment一次合并成一個較大索引,所以mergeFactor越大耗費內存越多,索引速度也會快些。
IndexWriter writer = new IndexWriter(directory, analyzer, true, IndexWriter.MaxFieldLength.LIMITED);Console.WriteLine(writer.GetMergeFactor());//mergeFactor默認是10writer.SetMergeFactor(30);Console.WriteLine(writer.GetMergeFactor());//設置后,當前是30mergeFactor默認值是10,您可以自己設置合理的合并因子的值來加快構造索引。
2、maxMergeDocs
合并因子mergeFactor是從segment優化性能入手,而maxMergeDocs,看命名就知道是從構成子索引(segment)的文檔(document)著手提升性能。 maxMergeDocs參數決定寫入內存索引文檔(document)的個數,到達該數目后就把該內存索引寫入硬盤,生成一個新的子索引segment文件,所以該參數也就相當于一個內存buffer,一般來說越大索引速度越快。
需要注意的是,maxBufferedDocs這個參數默認是disabled的,因為lucene中還用另外一個參數(RAMBufferSizeMB)控制這個bufffer的索引文檔個數。其實maxBufferedDocs和RAMBufferSizeMB這兩個參數是可以一起使用的,一起使用時只要有一個觸發條件滿足就寫入硬盤,生成一個新的子索引segment文件。
?
maxMergeDocs默認值是常量int.MaxValue(2147483647)。
3、RAMBufferSizeMB
如你所知,這個參數作用類似于maxMergeDocs,控制用于緩存索引文檔的內存上限。如果buffer的索引文檔個數到達該上限就寫入硬盤。一般來說該參數越大,占用內存越大,索引速度也就越快。
IndexWriter writer = new IndexWriter(directory, analyzer, true, IndexWriter.MaxFieldLength.LIMITED);Console.WriteLine(writer.GetRAMBufferSizeMB());//RAMBufferSizeMB默認值是16 writer.SetRAMBufferSizeMB(1024);Console.WriteLine(writer.GetRAMBufferSizeMB());//設置后,當前是1024RAMBufferSizeMB默認值是16.
小結:通過上述分析說明,我們知道,合理設置三個參數的值,可以充分利用內存(理論上,參數值越大,內存利用越充分,但是必須和實際的機器性能相結合),避免頻繁的IO操作,提升索引速度。
二、關于索引文件的幾種常見格式
這里我主要參考了覺先的這一篇和這一篇非常耐心詳細的兩篇好文章。雖然收藏已久,但是直到現在自己還沒有完全搞明白各個文件之間的關系。現在看來,依然醍醐灌頂很有收獲。態度決定一切,有時間我會重新寫一篇更詳細透徹的學習筆記。下面重點記錄一下對我自己的實際編程有幫助的幾個文件格式。
1、.gen格式和segments_N
每個segment代表lucene的一個完整索引段,建立索引后必須存在的一個文件。一個索引(Index)可以同時存在多個segments_N。當我們要打開一個索引的時候,我們必須要選擇一個segments_N文件來打開。在打開索引選擇某個segments_N文件時,segments.gen文件和segments_N的N(Generation)的確定就有密切關系(具體邏輯可以參考這篇的4.1.1)。
2、.cfs格式
即復合索引文件格式。我們知道,索引的內容可能非常大,文件數量也可能非常多。如果遇到這種情況,系統打開文件的數量將很大,會極大地耗費系統資源。因此,lucene提供了一個單文件索引格式,也就是所謂的復合索引格式。使用復合索引格式存儲Document內容時,只需要在初始化完成一個IndexWriter對象后,使用SetUseCompoundFile(boolean)方法,在設置UseCompoundFile為true后,就會有這個文件。
IndexWriter writer = new IndexWriter(directory, analyzer, true, IndexWriter.MaxFieldLength.LIMITED);Console.WriteLine(writer.GetUseCompoundFile());//默認為truewriter.SetUseCompoundFile(false);Console.WriteLine(writer.GetUseCompoundFile());默認情況下,IndexWriter將UseCompoundFile置為True。
?
3、.lock格式
顧名思義,.lock就是鎖文件類型了。對于普通優化后的索引文件,這個鎖文件是看不到的。當我們通過IndexWriter或者IndexModifier對索引文件進行插入、修改或者刪除操作的時候,都會生成一個.lock的鎖文件。在lucene舊版本的類庫中,通過多線程進行索引更改等操作,很容易發生異常,通常情況下都是由于該鎖文件。提到了鎖機制,我們有必要了解一下lucene的并發性規則:
| 操作 | 是否允許 |
| 對同一個索引運行多個并行的搜索進程 | 是 |
| 對一個正在生成、被優化或正在與另一索引合并的索引運行多個并行的搜索進程,或該索引正在進行刪除、更新文檔等操作時,對索引運行多個并行的搜索進程 | 是 |
| 對同一個索引用多個IndexWriter對象執行添加、更新文檔的操作 | 否 |
| 當一個從索引中刪除文檔的IndexReader對象沒有成功關閉時,打開一個IndexWriter對象用于在這個索引中添加新的文檔 | 否 |
| IndexWriter對象向索引中添加新文檔后,未成功關閉;在此之后,打開一個IndexReader對象用于從這個索引中刪除文檔 | 否 |
我們可以看到這種并發性規則對于搜索是毫無限制的,但是索引的其他操作可能會對搜索產生影響,比如更新后還沒有優化的索引可能影響搜索速度,搜索的準確性也不可靠。好在我們的實際項目中都會有一定的策略來使用索引,比如相同的索引復制兩份,一份專門用來搜索,一份用來增刪改和優化,然后定時切換。
3、.fnm格式
包含 Document中所有Field名稱。
4、.fdx和.fdt格式
.fdt文件用于存儲具有 Field.Store.YES屬性的field的數據的相關信息。而.fdx類型文件則是一個索引,用于存儲域的信息。
5、.tii和.tis格式
.tii存儲分詞后term的索引文件,標明了每個.tis文件中詞條的位置。
6、deletable格式
在lucene的索引中,所有的文檔被刪除后并不是立刻從索引中去除,而是留待下次合并索引或對索引進行優化時才真正刪除。這種功能是通過deletable文件實現的。所有的文檔在被刪除后,會首先在deletable文件中留一個記錄,要真正刪除時,才將索引除去。
最后附上一張流傳于網上的簡明圖片說明一下常見的索引及其文件格式的關系:
其他參考文章:
http://lucene.apache.org/java/2_9_2/fileformats.html
轉載于:https://www.cnblogs.com/jeffwongishandsome/archive/2011/02/11/lucenet-net-explanation.html
總結
以上是生活随笔為你收集整理的Lucene.Net:关于索引的一些补充说明和总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 原则读书法:书这么多,读完就忘怎么办
- 下一篇: 植物大战僵尸的java源代码_植物大战僵