2010-08-26 88 views

回答

4

Lucene是爲回答相反的問題而建立的,也就是說,哪些文檔包含給定的術語。因此,爲了獲得文檔的條款數量,您必須進行一些修改。

第一種方法是爲每個字段存儲術語向量,您需要能夠檢索術語數。術語矢量是字段的術語列表。在搜索時,您可以使用IndexReader的getTermFreqVector方法(如果它們存儲在索引時)檢索它。當你有它的時候,你得到了矢量的長度,你有該字段的術語數。

如果您存儲了文檔的字段,另一種方法是取回這些字段的文本並通過分析它來計算術語的數量(將文本拆分爲單詞)。

最後,如果字段的項數的近似值足夠用於您,並且您在索引時存儲了標準,則可以選擇計算用於計算字段的標準的函數的反函數。如果仔細查看Similarity類的方法lengthNorm,您會注意到它使用了字段的條數。該方法的結果使用encodeNorm方法存儲在索引中。您可以在搜索時使用IndexReader的norms方法檢索規範。根據手中的規範,使用lengthNorm中使用的逆數學函數來取回術語數。就像我說的那樣,這只是一個近似值,因爲當規範被存儲時,一些精度會丟失,並且您可能無法獲得與存儲的數量完全相同的數字。

4

如果你沒有在索引時間存儲術語向量,這實際上是在Lucene中很難做到的。 Lucene的底層數據結構是一個倒排索引,它將條目存儲爲鍵並將文檔ID列表存儲爲值。這就是爲什麼API中沒有「getNumTerms()」方法的原因,因爲Lucene採用的基本數據結構不支持它。

也就是說,您可以將術語向量存儲在索引中,您可以在搜索時通過文檔ID查找術語向量。這些向量基本上是該文檔中所有術語的完整列表,然後您可以計算得到您的術語#。

http://lucene.apache.org/java/3_0_1/api/all/org/apache/lucene/document/Field.TermVector.html

或者,你可以事先計算所有的條款,並將其存儲在索引的字段。

+0

+1在索引時間存儲條款的數量是一個好主意 – 2010-08-26 13:49:51

相關問題