如何计算lucene索引中每个文档的术语数?
Lucene是为回答相反的问题而建立的,也就是说,哪些文档包含给定的术语。因此,为了获得文档的条款数量,您必须进行一些修改。
第一种方法是为每个字段存储术语向量,您需要能够检索术语数。术语矢量是字段的术语列表。在搜索时,您可以使用IndexReader的getTermFreqVector方法(如果它们存储在索引时)检索它。当你有它的时候,你得到了矢量的长度,你有该字段的术语数。
如果您存储了文档的字段,另一种方法是取回这些字段的文本并通过分析它来计算术语的数量(将文本拆分为单词)。
最后,如果字段的项数的近似值足够用于您,并且您在索引时存储了标准,则可以选择计算用于计算字段的标准的函数的反函数。如果仔细查看Similarity类的方法lengthNorm,您会注意到它使用了字段的条数。该方法的结果使用encodeNorm方法存储在索引中。您可以在搜索时使用IndexReader的norms方法检索规范。根据手中的规范,使用lengthNorm中使用的逆数学函数来取回术语数。就像我说的那样,这只是一个近似值,因为当规范被存储时,一些精度会丢失,并且您可能无法获得与存储的数量完全相同的数字。
如果你没有在索引时间存储术语向量,这实际上是在Lucene中很难做到的。 Lucene的底层数据结构是一个倒排索引,它将条目存储为键并将文档ID列表存储为值。这就是为什么API中没有“getNumTerms()”方法的原因,因为Lucene采用的基本数据结构不支持它。
也就是说,您可以将术语向量存储在索引中,您可以在搜索时通过文档ID查找术语向量。这些向量基本上是该文档中所有术语的完整列表,然后您可以计算得到您的术语#。
见
http://lucene.apache.org/java/3_0_1/api/all/org/apache/lucene/document/Field.TermVector.html
或者,你可以事先计算所有的条款,并将其存储在索引的字段。
+1在索引时间存储条款的数量是一个好主意 – 2010-08-26 13:49:51