我想知道lucene索引中每个文档的术语数。我一直在API和互联网上搜索,但没有结果。能不能帮帮我?
Lucene的建立是为了回答相反的问题,即哪些文档包含一个给定的术语。因此,为了得到一个文档的术语数量,你必须做一些黑客攻击。
第一种方法是为每个字段存储术语向量,你需要能够检索到术语的数量。术语向量就是字段的术语列表。在搜索的时候,你可以使用 getTermFreqVector 的方法(如果它们是在索引时存储的)。当你有了它,你就得到了向量的长度,你就有了那个字段的术语数。
另一种方法,如果你已经存储了你的文档的字段,则可以取回这些字段的文本,并通过分析它来计算术语的数量(将文本以字为单位分割)。
最后,如果一个字段的术语数的近似值对你来说已经足够了,而且你在索引时存储了规范,那么可以选择计算用于计算字段规范的反函数。如果你仔细观察这个方法 长度规范 的相似性类,你会注意到它使用字段的项数。这个方法的结果被存储在索引中,使用了 编码规范 方法。您可以在搜索时使用 准则 的方法。手中有了norm后,用lengthNorm中的反数学函数来取回项数。就像我说的,这只是一个近似值,因为当norm被存储时,会损失一些精度,你可能得到的数字和存储的数字不完全一样。
如果你在索引时没有存储术语向量,这在Lucene中其实是挺难做到的。Lucene的底层数据结构是一个倒置索引,它将术语作为键存储,将文档ID列表作为值存储。 这就是为什么API中没有 "getNumTerms() "方法,因为Lucene采用的基本数据结构不支持它。
也就是说,你可以在索引中存储术语向量,你可以在搜索时通过文档ID进行查询。 这些向量本质上是该文档中所有术语的完整列表,然后你可以对其进行计数以获得术语的数量。
请看
http:/lucene.apache.orgjava3_0_1apiallorgapachelucenedocumentField.TermVector.html。
另外,你也可以事先计算所有的术语,并将其作为一个字段存储在你的索引中。
你可以定义一个类似下面的方法来获取Lucene索引中文档字段中所有术语的数量。IndexReader
和a Field
名为 String
您之前在编制文档索引时定义的。
public static long getCountOfAllTerms(IndexReader indexReader,String field) throws IOException
{
return indexReader.getSumTotalTermFreq(field);
}