【问题标题】:Accessing terms statistics in Lucene 4在 Lucene 4 中访问术语统计信息
【发布时间】:2015-07-09 20:02:07
【问题描述】:

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

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

【问题讨论】:

    标签: java lucene information-retrieval language-model


    【解决方案1】:

    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 打一两个电话),这可能有点矫枉过正,但确实如此。

    【讨论】:

    • 谢谢! queryBoost 参数的值应该是多少?假设我对单个术语的统计数据感兴趣。
    • @EladKravi - 这是应用于查询中的术语的提升。请记住,BasicStats 类的目的是跟踪 Similarity impl 的数据,因此它使用这些统计数据来计算分数。嗯,应该让它成为一个浮动,实际上......
    猜你喜欢
    • 1970-01-01
    • 2010-10-13
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    相关资源
    最近更新 更多