У меня есть проблема с вычислением счета с 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
Это ожидаемое поведение. Вот объяснение создателя Lucene Дуга Каттинга:
Префиксный запрос эквивалентен запросу, содержащему все термины, соответствующие префиксу, и поэтому обычно содержит много терминов. При таком большом запросе, совпадающие документы, скорее всего, будут содержать меньше терминов запроса и поэтому совпадение будет слабее.
Прочитайте оригинальное сообщение, откуда взята цитата.
В Lucene, как правило, лучше использовать показатель только как относительную меру релевантности в наборе документов. Абсолютное значение показателя будет меняться в зависимости от стольких факторов, что его не следует использовать как есть.
UPDATE
Объяснение от Cutting относится к более старой версии Lucene. Таким образом, ответ от bajafresh4life является правильным.
По умолчанию 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 ().