如何计算lucene索引中每个文档的术语数量?

时间:2010-08-26 10:12:50

标签: java lucene

我想知道lucene索引中每个文档的术语数量。我一直在API和互联网上搜索没有结果。你能救我吗?

3 个答案:

答案 0 :(得分:4)

Lucene的目的是回答相反的问题,即哪些文档包含给定的术语。因此,为了获得文档的术语数量,您必须进行一些修改。

第一种方法是为每个字段存储术语向量,您需要能够检索术语数。术语矢量是字段的术语列表。在搜索时,您可以使用IndexReader的getTermFreqVector方法检索它(如果它们是在索引时存储的)。获得它后,您将获得向量的长度,并获得该字段的术语数。

另一种方法,如果你已经存储了文档的字段,那就是取回这些字段的文本,并通过分析来计算术语的数量(用文字分割文本)。

最后,如果字段的术语数量的近似值足以让您在索引时存储规范,则可以选择计算用于计算字段规范的函数的反函数。如果仔细查看Similarity类的方法lengthNorm,您会注意到它使用了字段的术语数。此方法的结果使用encodeNorm方法存储在索引中。您可以在搜索时使用IndexReader的norms方法检索规范。根据规范,使用lengthNorm中使用的逆数学函数来获取项的数量。就像我说的那样,它只是一个近似值,因为当存储规范时,会丢失一些精度,并且可能无法获得与存储的数量完全相同的数字。

答案 1 :(得分: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

或者,您可以事先计算所有条款,并将其存储为索引中的字段。

答案 2 :(得分:0)

您可以定义以下方法,以获取Lucene索引中文档字段中所有术语的计数。您应该创建IndexReader和一个Field的名称作为String,这是在索引文档之前定义的:

 public static long getCountOfAllTerms(IndexReader indexReader,String field) throws IOException
    {
        return indexReader.getSumTotalTermFreq(field);
    }