2014-01-14 47 views
3

我正在寫一個自定義lucenene目錄實現,並想知道爲什麼IndexWriter鎖定整個目錄實例,而不是鎖定文件。爲什麼Lucene會鎖定整個Directory?爲什麼不鎖定個別lucene文件?

我對Lucene內部結構還不是很熟悉,但是到目前爲止我所讀到的,我想限制每個'luce索引文件類型'的每個實例的鎖定,以支持多個索引器的併發索引

我相信,如果這是如此簡單,許多人現在已經做到了;所以想知道爲什麼不這樣做,以及爲什麼整個目錄被鎖定...

有人可以解釋爲什麼這樣做的原因,以及爲什麼不做我建議的原因?

感謝, 桑巴

回答

0

我覺得你對Lucene file format的理解過於簡單。

不僅Lucene不像您提出的那樣每個術語使用一個文件,而且它還存儲許多其他重要信息 - 術語向量,頻率,指針等等。此外,它必須存儲已刪除的文件並執行合併(並且這發生在幕後!) - 我可以向您保證整體複雜性非常高。最重要的是,Lucene提供了transactional support and implements all ACID properties。所有這些都不容易(甚至根本不可能)擁有多個併發作者。換句話說,Lucene面向CA in CAP

好的是,自從版本4開始,您可以plug your own format,所以請隨時嘗試並提出一個更好的選擇。

+0

Mindas嗨, 我建議鎖定在更新場數據爲第n段_n.fdt文件,同樣鎖定_n.fdx而upadting爲第n個部段場指數等 或者,如果這也不行,我們可能會鎖定特定段的所有lucene格式文件;或者可能是我們鎖定了所有段的特定lucene格式文件。 我想知道每種方法的缺點,或者如果沒有安全的工作,請清除NO。 – Saasira

+0

爲了您的所知,現場數據永遠不會更新 - 每次您想更新索引文檔時,作者都會刪除舊文檔,並將其與已更改的字段一起再次添加。所以這個操作沒有特別的鎖定。段文件名不會重複使用,但始終會遞增(字母數字基本形式)。文件write.lock只確保一個'IndexWriter'可以在當時使用該目錄,但這並不意味着'IndexWriter'只允許單個線程寫入。 – mindas

+0

我在看從多臺機器索引到一個共同的索引;因此提出了放寬鎖定機制從特定目錄到特定文件或特定格式的問題。 – Saasira

相關問題