我想知道Lucene索引中每个文档的词条数。我已经在API和互联网上搜索过了,但没有结果。你能帮助我吗?
b1zrtrql1#
Lucene是为回答相反的问题而构建的,即哪些文档包含给定的术语。因此,为了获得文档的术语数量,您必须进行一些修改。第一种方法是存储每个字段的术语向量,以便能够检索术语的数量。术语向量是字段的术语列表。在搜索时,可以使用IndexReader的getTermFreqVector方法检索它(如果它们在索引时存储)。当您有了它时,您就得到了向量的长度和该字段的术语数量。另一种方法,如果你已经存储了你的文档的字段,是取回那些字段的文本,并通过分析它来计算术语的数量(将文本拆分成单词)。最后,如果一个域的项数的近似值对你来说足够了,并且你在索引时存储了范数,那么你可以选择计算一个用于计算域的范数的反函数。如果你仔细观察相似性类的方法lengthNorm,你会注意到它使用了一个字段的项数。2这个方法的结果被存储在使用encodeNorm方法的索引中。3在搜索的时候,使用IndexReader的norms方法检索范数。有了范数,使用lengthNorm中使用的数学函数的逆函数来检索项数。就像我说的,这只是一个近似值,因为当存储范数时,丢失了一些精度,您可能不会得到与存储的数字完全相同的数字。
lndjwyie2#
如果在索引时不存储术语向量,在Lucene中实际上很难做到这一点。Lucene的底层数据结构是一个倒排索引,它将术语存储为键,将文档ID列表存储为值。这就是为什么在API中没有“getNumTerms()”方法的原因,因为Lucene使用的基本数据结构不支持它。也就是说,您可以在索引中存储术语向量,在搜索时可以通过文档ID查找这些向量。这些向量实际上是文档中所有术语的完整列表,然后您可以计算这些向量以获得术语的数量。请参阅http://lucene.apache.org/java/3_0_1/api/all/org/apache/lucene/document/Field.TermVector.html或者,您可以事先计算所有的字词,并将其储存为索引中的字段。
vql8enpb3#
你可以定义一个如下的方法来获取Lucene索引中文档字段中所有词条的计数。你应该创建IndexReader和一个Field名称作为String,这是你之前在索引文档时定义的:
IndexReader
Field
String
public static long getCountOfAllTerms(IndexReader indexReader,String field) throws IOException { return indexReader.getSumTotalTermFreq(field); }
3条答案
按热度按时间b1zrtrql1#
Lucene是为回答相反的问题而构建的,即哪些文档包含给定的术语。因此,为了获得文档的术语数量,您必须进行一些修改。
第一种方法是存储每个字段的术语向量,以便能够检索术语的数量。术语向量是字段的术语列表。在搜索时,可以使用IndexReader的getTermFreqVector方法检索它(如果它们在索引时存储)。当您有了它时,您就得到了向量的长度和该字段的术语数量。
另一种方法,如果你已经存储了你的文档的字段,是取回那些字段的文本,并通过分析它来计算术语的数量(将文本拆分成单词)。
最后,如果一个域的项数的近似值对你来说足够了,并且你在索引时存储了范数,那么你可以选择计算一个用于计算域的范数的反函数。如果你仔细观察相似性类的方法lengthNorm,你会注意到它使用了一个字段的项数。2这个方法的结果被存储在使用encodeNorm方法的索引中。3在搜索的时候,使用IndexReader的norms方法检索范数。有了范数,使用lengthNorm中使用的数学函数的逆函数来检索项数。就像我说的,这只是一个近似值,因为当存储范数时,丢失了一些精度,您可能不会得到与存储的数字完全相同的数字。
lndjwyie2#
如果在索引时不存储术语向量,在Lucene中实际上很难做到这一点。Lucene的底层数据结构是一个倒排索引,它将术语存储为键,将文档ID列表存储为值。这就是为什么在API中没有“getNumTerms()”方法的原因,因为Lucene使用的基本数据结构不支持它。
也就是说,您可以在索引中存储术语向量,在搜索时可以通过文档ID查找这些向量。这些向量实际上是文档中所有术语的完整列表,然后您可以计算这些向量以获得术语的数量。
请参阅
http://lucene.apache.org/java/3_0_1/api/all/org/apache/lucene/document/Field.TermVector.html
或者,您可以事先计算所有的字词,并将其储存为索引中的字段。
vql8enpb3#
你可以定义一个如下的方法来获取Lucene索引中文档字段中所有词条的计数。你应该创建
IndexReader
和一个Field
名称作为String
,这是你之前在索引文档时定义的: