java - 访问 Lucene 4 中的术语统计信息

标签 java lucene information-retrieval language-model

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

是否可以访问 Lucene 4 中的 BasicStats 类?

最佳答案

BasicStats它本身不会对你有多大作用。它所做的只是为您保存值(value)观,它没有任何智能获取该信息。

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 ),这可能有点矫枉过正,但事实就是如此。

关于java - 访问 Lucene 4 中的术语统计信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31327126/

相关文章:

java - 无法解决使用 eclipse luna 和 equinox 进行编译的基本障碍(新手)

java - 记录 JdbcTemplate 查询执行时间

java - 使用 lucene 提取 tf-idf vector

java - Lucene 3.5 搜索时不支持中文、俄语、韩语

mysql - 在 Apache Solr 中索引 MySQL

mysql - 包含 IP 地址和网络信息的数据库设计

java - Java 中的分隔符

自定义累加器的 java.lang.NullPointerException

database - Google 搜索/ map Linux 集群的软件/硬件结构?

search - 执行 "related searches"功能的方法