【问题标题】:Add BM25 scoring in Lucene在 Lucene 中添加 BM25 评分
【发布时间】:2016-07-04 14:33:59
【问题描述】:

我是 Lucene 的新手。我正在使用 Lucene-3.6.0.jar 在 java 中使用 Lucene。我按照http://www.tutorialspoint.com/lucene/ 的教程进行操作。我的基本代码如下:

public class LuceneTester {
String indexDir = "Data/Indexdir";
String dataDir = "Data/Datadir";
Indexer indexer;
Searcher searcher;

public static void test() {
    LuceneTester tester;
    try {
        tester = new LuceneTester();
        tester.createIndex();
        tester.search("malformed");
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ParseException e) {
        e.printStackTrace();
    }
}

private void createIndex() throws IOException {
    indexer = new Indexer(indexDir);
    int numIndexed;
    long startTime = System.currentTimeMillis();
    numIndexed = indexer.createIndex(dataDir, new TextFileFilter());
    long endTime = System.currentTimeMillis();
    indexer.close();
    System.out.println(numIndexed + " File indexed, time taken: "
            + (endTime - startTime) + " ms");
}

private void search(String searchQuery) throws IOException, ParseException {
    searcher = new Searcher(indexDir);
    long startTime = System.currentTimeMillis();
    Term term = new Term(LuceneConstants.CONTENTS, searchQuery);
    Query query = new FuzzyQuery(term);
    System.out.println("Query: " + query.toString());
    TopDocs hits = searcher.search(query, Sort.RELEVANCE);
    long endTime = System.currentTimeMillis();
    System.out.println(hits.totalHits + " documents found. Time :"
            + (endTime - startTime));
    for (ScoreDoc scoreDoc : hits.scoreDocs) {
        Document doc = searcher.getDocument(scoreDoc);
        System.out.println("File: " + doc.get(LuceneConstants.FILE_PATH));
    }
    searcher.close();
}

现在,我想使用 BM25 相似度而不是默认评分技术。怎么做?

【问题讨论】:

  • 只是把它扔在那里,如果你刚开始使用 Lucene,如果可能的话,你最好学习一个更新的版本。自 3.6 以来,Lucene 的 API 发生了相当大的变化。我相信 Lucene 3.6 没有开箱即用的 BM25 实现。在当前版本 (6.1) 中,BM25 实际上是默认相似度,还有许多其他选项可用。

标签: java lucene


【解决方案1】:

Lucene 4.0 之前的 Lucene 版本没有 BM25 所需的所有信息,即文档级 IDF 和平均字段长度,因此无法直接在如此旧的版本中实现 BM25(您可以在外部存储所需的信息和/或近似它们,请参阅:http://www.slideshare.net/yuvalf/bm25-scoring-for-lucene-from-academia-to-industry 了解想法)。

从 4.0 起,Lucene 包含一个(最初是实验性的)BM25 实现:https://lucene.apache.org/core/4_0_0/core/org/apache/lucene/search/similarities/BM25Similarity.html

正如 femtoRgon 建议的那样,使用 Lucene 6 或更高版本,会给您开箱即用的 BM25。如果这对您没有帮助并且您至少可以使用 Lucene 4+,您可以将默认相似度更改为 BM25:

IndexSearcher searcher = ...
searcher.setSimilarity(new BM25Similarity());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 2011-04-04
    • 2010-09-05
    • 2019-05-04
    • 2010-12-13
    相关资源
    最近更新 更多