Как реализовать собственный рейтинг в результатах поиска? - PullRequest
3 голосов
/ 19 июля 2009

Мой индекс 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 использовать мой собственный класс ранжирования для ранжирования результатов?

1 Ответ

1 голос
/ 20 июля 2009

Вы можете реализовать свой собственный алгоритм оценки, расширив класс Similarity и передав его во время поиска. В Javadoc этого класса (перейдите по ссылке) вы можете прочитать подробности алгоритма оценки. Еще немного текста о выигрыше можно найти здесь . Исключительная помощь для понимания оценки заключается в том, чтобы фактически увидеть объяснение оценки, возвращаемое Searcher.explain ()

Кстати, оценка, которую вы хотите реализовать, является оценкой по умолчанию. Порядок результатов будет по желанию, хотя фактические оценки могут отличаться от 0,5 или 0,25.

EDIT: Обновлены ссылки в исходном ответе, относящемся к Lucene v2.4, до v5.3.1.

...