在 Lucene 4 中访问术语统计信息
Accessing terms statistics in Lucene 4
我有一个 Lucene 索引,我需要访问一些统计信息,例如术语收集频率。 BasicStats
class 有这个信息,但是,我不明白这个 class 是否可以访问。
是否可以在 Lucene 4 中访问 BasicStats
class?
BasicStats
本身对您没有多大帮助。它所做的只是为您保存价值,它没有任何智能来获取该信息。
BasicStats
旨在供 Similarity
实现使用,它生成所有要放入其中的信息。它在 SimilarityBase
中用于执行此操作的方法受到保护,但我们可以使用那里的代码。要填充 BasicStats
,您还需要一个 CollectionStatistics
和一个 TermStatistics
,但实际上您需要的只是您感兴趣的 Term
,和一个 IndexReader
:
public static BasicStats getBasicStats(IndexReader indexReader, Term myTerm, float queryBoost) throws IOException {
String fieldName = myTerm.field();
CollectionStatistics collectionStats = new CollectionStatistics(
"field",
indexReader.maxDoc(),
indexReader.getDocCount(fieldName),
indexReader.getSumTotalTermFreq(fieldName),
indexReader.getSumDocFreq(fieldName)
);
TermStatistics termStats = new TermStatistics(
myTerm.bytes(),
indexReader.docFreq(myTerm),
indexReader.totalTermFreq(myTerm)
);
BasicStats myStats = new BasicStats(fieldName, queryBoost);
assert collectionStats.sumTotalTermFreq() == -1 || collectionStats.sumTotalTermFreq() >= termStats.totalTermFreq();
long numberOfDocuments = collectionStats.maxDoc();
long docFreq = termStats.docFreq();
long totalTermFreq = termStats.totalTermFreq();
if (totalTermFreq == -1) {
totalTermFreq = docFreq;
}
final long numberOfFieldTokens;
final float avgFieldLength;
long sumTotalTermFreq = collectionStats.sumTotalTermFreq();
if (sumTotalTermFreq <= 0) {
numberOfFieldTokens = docFreq;
avgFieldLength = 1;
} else {
numberOfFieldTokens = sumTotalTermFreq;
avgFieldLength = (float)numberOfFieldTokens / numberOfDocuments;
}
myStats.setNumberOfDocuments(numberOfDocuments);
myStats.setNumberOfFieldTokens(numberOfFieldTokens);
myStats.setAvgFieldLength(avgFieldLength);
myStats.setDocFreq(docFreq);
myStats.setTotalTermFreq(totalTermFreq);
return myStats;
}
如果您所追求的只是一两个特定数字(即对 IndexReader
的一两次调用),这可能有点矫枉过正,但确实如此。
我有一个 Lucene 索引,我需要访问一些统计信息,例如术语收集频率。 BasicStats
class 有这个信息,但是,我不明白这个 class 是否可以访问。
是否可以在 Lucene 4 中访问 BasicStats
class?
BasicStats
本身对您没有多大帮助。它所做的只是为您保存价值,它没有任何智能来获取该信息。
BasicStats
旨在供 Similarity
实现使用,它生成所有要放入其中的信息。它在 SimilarityBase
中用于执行此操作的方法受到保护,但我们可以使用那里的代码。要填充 BasicStats
,您还需要一个 CollectionStatistics
和一个 TermStatistics
,但实际上您需要的只是您感兴趣的 Term
,和一个 IndexReader
:
public static BasicStats getBasicStats(IndexReader indexReader, Term myTerm, float queryBoost) throws IOException {
String fieldName = myTerm.field();
CollectionStatistics collectionStats = new CollectionStatistics(
"field",
indexReader.maxDoc(),
indexReader.getDocCount(fieldName),
indexReader.getSumTotalTermFreq(fieldName),
indexReader.getSumDocFreq(fieldName)
);
TermStatistics termStats = new TermStatistics(
myTerm.bytes(),
indexReader.docFreq(myTerm),
indexReader.totalTermFreq(myTerm)
);
BasicStats myStats = new BasicStats(fieldName, queryBoost);
assert collectionStats.sumTotalTermFreq() == -1 || collectionStats.sumTotalTermFreq() >= termStats.totalTermFreq();
long numberOfDocuments = collectionStats.maxDoc();
long docFreq = termStats.docFreq();
long totalTermFreq = termStats.totalTermFreq();
if (totalTermFreq == -1) {
totalTermFreq = docFreq;
}
final long numberOfFieldTokens;
final float avgFieldLength;
long sumTotalTermFreq = collectionStats.sumTotalTermFreq();
if (sumTotalTermFreq <= 0) {
numberOfFieldTokens = docFreq;
avgFieldLength = 1;
} else {
numberOfFieldTokens = sumTotalTermFreq;
avgFieldLength = (float)numberOfFieldTokens / numberOfDocuments;
}
myStats.setNumberOfDocuments(numberOfDocuments);
myStats.setNumberOfFieldTokens(numberOfFieldTokens);
myStats.setAvgFieldLength(avgFieldLength);
myStats.setDocFreq(docFreq);
myStats.setTotalTermFreq(totalTermFreq);
return myStats;
}
如果您所追求的只是一两个特定数字(即对 IndexReader
的一两次调用),这可能有点矫枉过正,但确实如此。