java - Lucene:使用 PrefixQuery 计算分数

标签 java lucene lucene.net

我在使用 PrefixQuery 计算分数时遇到问题。要更改每个文档的分数,当将文档添加到索引时,我使用 setBoost 来更改文档的提升。然后我创建 PrefixQuery 来搜索,但结果并没有根据提升而改变。 setBoost 似乎完全不适用于 PrefixQuery。请在下面检查我的代码:

 @Test
 public void testNormsDocBoost() throws Exception {
    Directory dir = new RAMDirectory();
    IndexWriter writer = new IndexWriter(dir, new StandardAnalyzer(Version.LUCENE_CURRENT), true,
            IndexWriter.MaxFieldLength.LIMITED);
    Document doc1 = new Document();
    Field f1 = new Field("contents", "common1", Field.Store.YES, Field.Index.ANALYZED);
    doc1.add(f1);
    doc1.setBoost(100);
    writer.addDocument(doc1);
    Document doc2 = new Document();
    Field f2 = new Field("contents", "common2", Field.Store.YES, Field.Index.ANALYZED);
    doc2.add(f2);
    doc2.setBoost(200);
    writer.addDocument(doc2);
    Document doc3 = new Document();
    Field f3 = new Field("contents", "common3", Field.Store.YES, Field.Index.ANALYZED);
    doc3.add(f3);
    doc3.setBoost(300);
    writer.addDocument(doc3);
    writer.close();

    IndexReader reader = IndexReader.open(dir);
    IndexSearcher searcher = new IndexSearcher(reader);

    TopDocs docs = searcher.search(new PrefixQuery(new Term("contents", "common")), 10);
    for (ScoreDoc doc : docs.scoreDocs) {
        System.out.println("docid : " + doc.doc + " score : " + doc.score + " "
                + searcher.doc(doc.doc).get("contents"));
    }
} 

输出是:

 docid : 0 score : 1.0 common1
 docid : 1 score : 1.0 common2
 docid : 2 score : 1.0 common3

最佳答案

默认情况下,PrefixQuery 重写查询以使用 ConstantScoreQuery,它为每个匹配的文档提供 1.0 分。我认为这是为了让 PrefixQuery 更快。所以你的提升被忽略了。

如果您希望提升在您的 PrefixQuery 中生效,您需要调用 setRewriteMethod(),在您的前缀查询实例上使用 SCORING_BOOLEAN_QUERY_REWRITE 常量。参见 http://lucene.apache.org/java/2_9_1/api/all/index.html .

对于调试,您可以使用 searcher.explain()。

关于java - Lucene:使用 PrefixQuery 计算分数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3060636/

相关文章:

performance - Lucene 搜索耗时太长

java - 使用 docx4j 将段落中的特定单词加粗

java - 监听器接口(interface)无法与回收器 View 中的卡片 View 的 onClick 配合使用

c# - Lucene .NET 搜索结果

c# - Lucene.Net 多字段多词搜索和通配符使用和短语搜索,模糊搜索都

lucene.net - 将 Lucene.Net 与存储库模式一起使用?

geolocation - Lucene.net 邻近搜索

java - 合并 Json 对象

java - 通过用户输入在java中打印一系列数字

java - 加载分析器时 Lucene ClassNotFoundError