Lucene:使用PrefixQuery进行分数计算

Kev*_*ven 8 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"));
    }
} 
Run Code Online (Sandbox Code Playgroud)

输出是:

 docid : 0 score : 1.0 common1
 docid : 1 score : 1.0 common2
 docid : 2 score : 1.0 common3
Run Code Online (Sandbox Code Playgroud)

baj*_*ife 11

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

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

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


Pas*_*imo 2

这是预期的行为。以下是 Lucene 创建者 Doug Cutting 的解释:

PrefixQuery 相当于包含所有与前缀匹配的术语的查询,因此通常包含很多术语。对于如此大的查询,匹配文档可能包含较少的查询术语,因此匹配较弱。

请阅读引用的原始帖子。

对于 Lucene,通常最好仅使用分数作为一组文档中相关性的相对度量。分数的绝对值会根据许多因素而变化,因此不应按原样使用。

更新
Cutting 的解释是指旧版本的 Lucene。因此 bajafresh4life 的答案是正确的。