Lucene: вычисление Счета с PrefixQuery

У меня есть проблема с вычислением счета с 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
8
задан WorkSmarter 4 February 2015 в 01:27
поделиться

2 ответа

Это ожидаемое поведение. Вот объяснение создателя Lucene Дуга Каттинга:

Префиксный запрос эквивалентен запросу, содержащему все термины, соответствующие префиксу, и поэтому обычно содержит много терминов. При таком большом запросе, совпадающие документы, скорее всего, будут содержать меньше терминов запроса и поэтому совпадение будет слабее.

Прочитайте оригинальное сообщение, откуда взята цитата.

В Lucene, как правило, лучше использовать показатель только как относительную меру релевантности в наборе документов. Абсолютное значение показателя будет меняться в зависимости от стольких факторов, что его не следует использовать как есть.

UPDATE
Объяснение от Cutting относится к более старой версии Lucene. Таким образом, ответ от bajafresh4life является правильным.

2
ответ дан 5 December 2019 в 12:55
поделиться

По умолчанию PrefixQuery перезаписывает запрос для использования ConstantScoreQuery, что дает каждому соответствующему документу оценку 1,0. Я думаю, это для того, чтобы PrefixQuery стал быстрее. Таким образом, ваши бонусы игнорируются.

Если вы хотите, чтобы повышения вступили в силу в вашем PrefixQuery, вам нужно вызвать setRewriteMethod (), используя константу SCORING_BOOLEAN_QUERY_REWRITE в экземпляре префиксного запроса. См. http://lucene.apache.org/java/2_9_1/api/all/index.html .

Для отладки вы можете использовать searchcher.explain ().

11
ответ дан 5 December 2019 в 12:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: