как написать пользовательскую функцию ранжирования, которая отдает предпочтение title

На github увидел пример в котором отдельно выделяется поле title

select id, weight() as w1, FLOOR ( bm25f(1.2, 0.8, {title=10}) * 100000 ) as w2 from test where match('Mary lamb') option ranker=expr('bm25f(1.2, 0.8, {title=10}) * 1000');

select id, weight() as w1, FLOOR ( bm25f(1.2, 0.8, {title=2}) * 100000 ) as w2 from test where match('Mary lamb') option ranker=expr('bm25f(1.2, 0.8, {title=10}) * 1000');

Написание правильного ranker пока для меня сложно :slight_smile:

Подскажите пожалуйста - если есть текстовые поля title и description, если, например слово samsung встречается и в title и description - то записи, в которых в description есть samsung, а в title нет - показать в конце.

Как в таком случае надо написать пользовательский ranker ?

а почему не использовать просто field_weights ? задать нужным полям веса больше и без всяких кастомных ранкеров должно работать

1 Like

Спасибо!

С одной стороны документация замечательно написана - там написано: у нас есть это и это

С другой стороны раздел “Sorting and ranking” мне так и не удалось понять.

Хотелось бы чтобы было больше практических кейсов с примерами - в каких случаях что применять

тот же самый field_weights - наверно самая простая для использования опция - но она как то не объяснена.

Опять же непонятно - а какие числа ставить ?
Они должны друг от друга существенно отличаться - в несколько раз ?

SELECT ... OPTION field_weights=(title=10, body=3)

или title достаточно присвоить 2?

В документации написано:
default ranker = sum(lcs*user_weight)*1000+bm25

если я правильно понял - то от вычисленного значения берется логарифм и значение располагается в диапазоне
[-log(N), log(N)]

Судя по формуле default ranker вроде бы вполне достаточно записать field_weights=(title=2 ), у остальных полей веса по умолчанию равны 1