访问Lucene中的术语统计4

时间:2015-07-09 20:02:08

标签: java lucene information-retrieval language-model

我有一个Lucene索引,我需要访问一些统计信息,例如术语收集频率。 BasicStats类有这些信息,但是,我无法理解这个类是否可访问。

是否可以在Lucene 4中访问BasicStats课程?

1 个答案:

答案 0 :(得分:1)

BasicStats对你自己不会有太大帮助。它所做的一切就是为你保留价值,它没有任何智能来获取这些信息。

BasicStats旨在由Similarity实现使用,该实现生成要放入其中的所有信息。它在SimilarityBase中用于执行此操作的方法受到保护,但我们可以在那里使用代码。要填充BasicStats,您还需要CollectionStatisticsTermStatistics,但实际上您需要获得的是您感兴趣的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的电话),这可能是过度的,但确实如此。