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

3

我想知道Lucene索引中每个文档的术语数量。我在API和互联网上搜索了很久,但没有结果。你能帮助我吗?

3个回答

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
你可以定义一个方法来获取Lucene索引中文档字段中所有术语的计数,方法如下所示。你应该创建一个IndexReader和一个Field名称作为一个String,这个名称是你在索引文档时定义的:
 public static long getCountOfAllTerms(IndexReader indexReader,String field) throws IOException
    {
        return indexReader.getSumTotalTermFreq(field);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接