2012-10-29 31 views
0

我有Lucene .Net索引(目前運行的版本是2.9.2,但我很快就會升級到新的3.0.3)。TermPositions如何在lucene中工作?

對於搜索性能問題,我需要創建從DocId到應用程序ID的內存映射 - 所以我不需要從索引中獲取存儲值(搜索結果可能會返回數以千計的文檔...)。由於我有很多索引迭代,我需要更新\重新創建這個映射很多次 - 所以我需要快速完成。

我看到this great article試圖解決這個問題,並通過使用Lucene的FieldCache機制檢索結果或在唯一索引字段上使用TermPositions枚舉比較時間。正如作者所說,確實使用TermPositions創建映射比使用Lucene的FieldCache快得多,但它對我理解爲什麼非常重要。有人向我解釋TermPositionsFieldCache在scenene後面做了什麼?

回答

0

Lucene中的TermPositions是一項高級功能。我只用過它一次(像從前一樣從2.9.x遷移到3.0.3 RC2時)。 TermPositions使用Tuple's非常高效地存儲,這使得訪問作爲一種數據結構快速而且很小,所以用術語「位置」來檢索有效載荷的速度也很快。

我實際上最終在書中名爲「Lucene in Action」中的樣本......它是針對Java的,但它基於Lucene 3.0.3,對於Lucene.NET 3.0.3來說是完美的:)

我提到這點,因爲FieldCache在這本書中有很深的篇幅,如果你想深入瞭解它(深入理解)......我會先看看那裏。

順便說一句...該文章基於Lucene 2.2,2.3-> 2.9.x是一個非常大的跳躍,當他們添加「近實時搜索」,並使很多方法過時... 3.0.3也改變了,所以他們的數字可能不能反映正在發生的事情。

0

原因很簡單。 Lucene將字段值存儲爲字符串。當您調用GetInts並且這些值不在緩存內時,它需要讀取這些字符串,然後將它們解析爲整數。

當您使用的有效載荷,你將編碼的整數的字節數組,你轉換回一個int。這樣,您只需要讓Lucene在給定位置讀取4個原始字節,然後將其轉換回int。

字符串讀取/解析操作是什麼在這裏造成很大的差異