日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

Lucene.Net:关于索引的一些补充说明和总结

發(fā)布時(shí)間:2023/12/20 asp.net 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Lucene.Net:关于索引的一些补充说明和总结 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在前面的幾篇關(guān)于lucene的文章中,我已經(jīng)簡(jiǎn)要說明了如何利用lucene進(jìn)行分詞、索引和搜索。最近大部分時(shí)間耗在查資料上,看得比較多比較雜但是一貫的不夠深入,還好多數(shù)都是不會(huì)影響編程實(shí)踐的概念性的東西。有時(shí)候我自己也感覺到有心無力,太關(guān)注那些表面的繁文縟節(jié)性的東西有讓人失掉好奇、激情和勤奮實(shí)踐的風(fēng)險(xiǎn),畢竟我個(gè)人需要專心專注的事情是解決問題而不是多知道幾個(gè)概念和專業(yè)名詞,要先做出東西來,雖然這樣顯得不是很專業(yè)。本文簡(jiǎn)單補(bǔ)充記錄一下對(duì)于lucene創(chuàng)建索引有用的幾個(gè)參數(shù)以及索引文件中的常見的幾種格式的感性認(rèn)識(shí)和總結(jié),希望對(duì)你也有幫助。

一、提高索引速度幾個(gè)有用的參數(shù)

在索引算法確定的情況下,最為影響lucene索引速度的主要是三個(gè)參數(shù),即IndexWriter中的 mergeFactor, maxMergeDocs和RAMBufferSizeMB 。這些參數(shù)主要就是控制內(nèi)外存交換和索引合并頻率,從而達(dá)到提高索引速度的目的,當(dāng)然這幾個(gè)參數(shù)的具體設(shè)定和機(jī)器的硬件條件也密不可分。

1、mergeFactor

mergeFactor就是所謂的“合并因子”,它的作用主要是用于子索引(segment)合并的。 如你所知,lucene中索引總體上是這樣進(jìn)行的:索引先寫入內(nèi)存,觸發(fā)一定限制條件后寫入硬盤,生成一個(gè)獨(dú)立的子索引(segment)。通常情況下,多個(gè)子索引在優(yōu)化(optimize())后會(huì)合并成一個(gè)索引,否則子索引會(huì)很多,影響檢索速度,而且占用的磁盤空間可能會(huì)非常大。mergeFactor這個(gè)參數(shù)就是控制當(dāng)硬盤中有多少個(gè)子索引segments時(shí),lucene就需要把這些子索引合并成一個(gè)較大一點(diǎn)的索引。合并的內(nèi)部實(shí)現(xiàn)細(xì)節(jié)我也不是很清楚,但是lucene 中默認(rèn)索引合并機(jī)制并不是兩兩合并,通常都是多個(gè)segment一次合并成一個(gè)較大索引,所以mergeFactor越大耗費(fèi)內(nèi)存越多,索引速度也會(huì)快些。

IndexWriter writer = new IndexWriter(directory, analyzer, true, IndexWriter.MaxFieldLength.LIMITED);Console.WriteLine(writer.GetMergeFactor());//mergeFactor默認(rèn)是10writer.SetMergeFactor(30);Console.WriteLine(writer.GetMergeFactor());//設(shè)置后,當(dāng)前是30

mergeFactor默認(rèn)值是10,您可以自己設(shè)置合理的合并因子的值來加快構(gòu)造索引。

2、maxMergeDocs

合并因子mergeFactor是從segment優(yōu)化性能入手,而maxMergeDocs,看命名就知道是從構(gòu)成子索引(segment)的文檔(document)著手提升性能。 maxMergeDocs參數(shù)決定寫入內(nèi)存索引文檔(document)的個(gè)數(shù),到達(dá)該數(shù)目后就把該內(nèi)存索引寫入硬盤,生成一個(gè)新的子索引segment文件,所以該參數(shù)也就相當(dāng)于一個(gè)內(nèi)存buffer,一般來說越大索引速度越快。

需要注意的是,maxBufferedDocs這個(gè)參數(shù)默認(rèn)是disabled的,因?yàn)閘ucene中還用另外一個(gè)參數(shù)(RAMBufferSizeMB)控制這個(gè)bufffer的索引文檔個(gè)數(shù)。其實(shí)maxBufferedDocs和RAMBufferSizeMB這兩個(gè)參數(shù)是可以一起使用的,一起使用時(shí)只要有一個(gè)觸發(fā)條件滿足就寫入硬盤,生成一個(gè)新的子索引segment文件。
?

IndexWriter writer = new IndexWriter(directory, analyzer, true, IndexWriter.MaxFieldLength.LIMITED);Console.WriteLine(writer.GetMaxMergeDocs());//MaxMergeDocs默認(rèn)值是2147483647 (也即int.MaxValue)writer.SetMaxMergeDocs(1024);Console.WriteLine(writer.GetMaxMergeDocs());//設(shè)置后,當(dāng)前是1024

maxMergeDocs默認(rèn)值是常量int.MaxValue(2147483647)。

3、RAMBufferSizeMB

如你所知,這個(gè)參數(shù)作用類似于maxMergeDocs,控制用于緩存索引文檔的內(nèi)存上限。如果buffer的索引文檔個(gè)數(shù)到達(dá)該上限就寫入硬盤。一般來說該參數(shù)越大,占用內(nèi)存越大,索引速度也就越快。

IndexWriter writer = new IndexWriter(directory, analyzer, true, IndexWriter.MaxFieldLength.LIMITED);Console.WriteLine(writer.GetRAMBufferSizeMB());//RAMBufferSizeMB默認(rèn)值是16 writer.SetRAMBufferSizeMB(1024);Console.WriteLine(writer.GetRAMBufferSizeMB());//設(shè)置后,當(dāng)前是1024

RAMBufferSizeMB默認(rèn)值是16.

小結(jié):通過上述分析說明,我們知道,合理設(shè)置三個(gè)參數(shù)的值,可以充分利用內(nèi)存(理論上,參數(shù)值越大,內(nèi)存利用越充分,但是必須和實(shí)際的機(jī)器性能相結(jié)合),避免頻繁的IO操作,提升索引速度。

二、關(guān)于索引文件的幾種常見格式

這里我主要參考了覺先的這一篇和這一篇非常耐心詳細(xì)的兩篇好文章。雖然收藏已久,但是直到現(xiàn)在自己還沒有完全搞明白各個(gè)文件之間的關(guān)系?,F(xiàn)在看來,依然醍醐灌頂很有收獲。態(tài)度決定一切,有時(shí)間我會(huì)重新寫一篇更詳細(xì)透徹的學(xué)習(xí)筆記。下面重點(diǎn)記錄一下對(duì)我自己的實(shí)際編程有幫助的幾個(gè)文件格式。

1、.gen格式和segments_N

每個(gè)segment代表lucene的一個(gè)完整索引段,建立索引后必須存在的一個(gè)文件。一個(gè)索引(Index)可以同時(shí)存在多個(gè)segments_N。當(dāng)我們要打開一個(gè)索引的時(shí)候,我們必須要選擇一個(gè)segments_N文件來打開。在打開索引選擇某個(gè)segments_N文件時(shí),segments.gen文件和segments_N的N(Generation)的確定就有密切關(guān)系(具體邏輯可以參考這篇的4.1.1)。

2、.cfs格式

即復(fù)合索引文件格式。我們知道,索引的內(nèi)容可能非常大,文件數(shù)量也可能非常多。如果遇到這種情況,系統(tǒng)打開文件的數(shù)量將很大,會(huì)極大地耗費(fèi)系統(tǒng)資源。因此,lucene提供了一個(gè)單文件索引格式,也就是所謂的復(fù)合索引格式。使用復(fù)合索引格式存儲(chǔ)Document內(nèi)容時(shí),只需要在初始化完成一個(gè)IndexWriter對(duì)象后,使用SetUseCompoundFile(boolean)方法,在設(shè)置UseCompoundFile為true后,就會(huì)有這個(gè)文件。

IndexWriter writer = new IndexWriter(directory, analyzer, true, IndexWriter.MaxFieldLength.LIMITED);Console.WriteLine(writer.GetUseCompoundFile());//默認(rèn)為truewriter.SetUseCompoundFile(false);Console.WriteLine(writer.GetUseCompoundFile());

默認(rèn)情況下,IndexWriter將UseCompoundFile置為True。

?

3、.lock格式

顧名思義,.lock就是鎖文件類型了。對(duì)于普通優(yōu)化后的索引文件,這個(gè)鎖文件是看不到的。當(dāng)我們通過IndexWriter或者IndexModifier對(duì)索引文件進(jìn)行插入、修改或者刪除操作的時(shí)候,都會(huì)生成一個(gè).lock的鎖文件。在lucene舊版本的類庫(kù)中,通過多線程進(jìn)行索引更改等操作,很容易發(fā)生異常,通常情況下都是由于該鎖文件。提到了鎖機(jī)制,我們有必要了解一下lucene的并發(fā)性規(guī)則:

操作是否允許
對(duì)同一個(gè)索引運(yùn)行多個(gè)并行的搜索進(jìn)程
對(duì)一個(gè)正在生成、被優(yōu)化或正在與另一索引合并的索引運(yùn)行多個(gè)并行的搜索進(jìn)程,或該索引正在進(jìn)行刪除、更新文檔等操作時(shí),對(duì)索引運(yùn)行多個(gè)并行的搜索進(jìn)程
對(duì)同一個(gè)索引用多個(gè)IndexWriter對(duì)象執(zhí)行添加、更新文檔的操作
當(dāng)一個(gè)從索引中刪除文檔的IndexReader對(duì)象沒有成功關(guān)閉時(shí),打開一個(gè)IndexWriter對(duì)象用于在這個(gè)索引中添加新的文檔
IndexWriter對(duì)象向索引中添加新文檔后,未成功關(guān)閉;在此之后,打開一個(gè)IndexReader對(duì)象用于從這個(gè)索引中刪除文檔

我們可以看到這種并發(fā)性規(guī)則對(duì)于搜索是毫無限制的,但是索引的其他操作可能會(huì)對(duì)搜索產(chǎn)生影響,比如更新后還沒有優(yōu)化的索引可能影響搜索速度,搜索的準(zhǔn)確性也不可靠。好在我們的實(shí)際項(xiàng)目中都會(huì)有一定的策略來使用索引,比如相同的索引復(fù)制兩份,一份專門用來搜索,一份用來增刪改和優(yōu)化,然后定時(shí)切換。

3、.fnm格式

包含 Document中所有Field名稱。

4、.fdx和.fdt格式

.fdt文件用于存儲(chǔ)具有 Field.Store.YES屬性的field的數(shù)據(jù)的相關(guān)信息。而.fdx類型文件則是一個(gè)索引,用于存儲(chǔ)域的信息。

5、.tii和.tis格式

.tii存儲(chǔ)分詞后term的索引文件,標(biāo)明了每個(gè).tis文件中詞條的位置。

6、deletable格式

在lucene的索引中,所有的文檔被刪除后并不是立刻從索引中去除,而是留待下次合并索引或?qū)λ饕M(jìn)行優(yōu)化時(shí)才真正刪除。這種功能是通過deletable文件實(shí)現(xiàn)的。所有的文檔在被刪除后,會(huì)首先在deletable文件中留一個(gè)記錄,要真正刪除時(shí),才將索引除去。

最后附上一張流傳于網(wǎng)上的簡(jiǎn)明圖片說明一下常見的索引及其文件格式的關(guān)系:

其他參考文章:

http://lucene.apache.org/java/2_9_2/fileformats.html

轉(zhuǎn)載于:https://www.cnblogs.com/jeffwongishandsome/archive/2011/02/11/lucenet-net-explanation.html

總結(jié)

以上是生活随笔為你收集整理的Lucene.Net:关于索引的一些补充说明和总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。