Мой индекс Lucene содержит документы с полем "itemName". Это поле увеличивается с коэффициентом усиления от 0 до 1.
Когда я создаю BooleanQuery, мне бы хотелось, чтобы результаты ранжировались по количеству соответствующих предложений и коэффициенту повышения, поэтому формула выглядит следующим образом:
score = (count_of_matching_clauses / count_of_total_clauses + boost_factor) / 2
Счет всегда будет с плавающей точкой от 0 до 1. 1, если все пункты совпадают, а коэффициент усиления равен 1.
Например, если значение поля «itemName» для трех документов без коэффициента повышения равно:
document1: "java is an island"
document2: "the secret of monkey island"
document3: "java island adventures"
и BooleanQuery будет выглядеть так:
TermQuery query1 = new TermQuery(new Term("name","java"));
TermQuery query2 = new TermQuery(new Term("name","island"));
BooleanQuery query = new BooleanQuery();
query.add(query1, BooleanClause.Occur.SHOULD);
query.add(query2, BooleanClause.Occur.SHOULD);
, чем будет извлечен document1 со счетом (2/2 +0) / 2 = 0,5, потому что:
count_of_matching_clauses = 2 и
count_of_total_clauses = 2
document2 будет получен со счетом (1/2 + 0) / 2 = 0,25, потому что:
count_of_matching_clauses = 1 и
count_of_total_clauses = 2
, чем будет извлечен document3 со счетом (2/2 +0) / 2 = 0,5, потому что:
count_of_matching_clauses = 2 и
count_of_total_clauses = 2
Как реализовать этот механизм ранжирования в люцене? Как я могу сказать lucene использовать мой собственный класс ранжирования для ранжирования результатов?