|
Ранжирование результатов поиска по точному вхождению строки
|
|||
---|---|---|---|
#18+
Привет! Настроил поиск по трём столбцам таблицы: заголовок, свойства товара и описание. Обновляется триггером: BEGIN NEW.fts=setweight( coalesce( to_tsvector('ru', NEW.name),''),'A') || ' ' || setweight( coalesce( to_tsvector('ru', NEW.property_text),''),'B') || ' ' || setweight( coalesce( to_tsvector('ru', NEW.description),''),'D'); RETURN NEW; END; Произвожу поиск так: SELECT "product".name, ts_rank_cd(fts, to_tsquery('русские&сказки:abd'), 0) AS rank FROM "product" WHERE (to_tsquery('русские&сказки:abd') @@ fts) ORDER BY "rank" DESC LIMIT 10 Получаю: name | rank ------------------------------------------------------------------------------------------------------------------- Сундук со сказками. Русские сказки (подарочный комплект из 15 аудиокниг) | 2.17219 Чудесные русские сказки | 2.08084 Богатырские русские сказки | 2.08084 Русские сказки | 2.03032 Терем-теремок. Русские сказки | 2.02839 Счастливые сказки. Книга русских народных сказок и сказок русских писателей | 2.01136 Топтыгины сказки. Книга русских народных сказок и сказок русских писателей | 2.01136 Самые лучшие русские сказки | 1.97143 Русские сказки - 1 | 1.79299 Чудо чудное, диво дивное. Русские сказки (зеленая) | 1.74123 (10 rows) Если искать как to_tsquery('русские&сказки:a') (только по заголовкам) вывод сильно не меняется: name | rank ------------------------------------------------------------------------------------------------------------------- Сундук со сказками. Русские сказки (подарочный комплект из 15 аудиокниг) | 2.00791 Счастливые сказки. Книга русских народных сказок и сказок русских писателей | 2 Топтыгины сказки. Книга русских народных сказок и сказок русских писателей | 2 Терем-теремок. Русские сказки | 1.57143 Богатырские русские сказки | 1.57143 Чудесные русские сказки | 1.57143 Русские сказки | 1.57143 Самые лучшие русские сказки | 1.57143 CD-ROM. Поиграем в сказку! Русские народные сказки | 1.5303 Сказки Пушкина. Русские сказки. Былины и загадки. Зарубежные сказки | 1.51136 (10 rows) Всё норм, в первых 3-х строках два раза используется слово "сказка" и они (строки) имеют ранг 2. Задача: выводить в первую очередь товары с точным вхождением "Русские сказки". Таких товаров штук 5 есть, но в первой десятке только один товар. Пробовал играться с правилами ранжирования из мана: 0 (по умолчанию): длина документа не учитывается 1: ранг документа делится на 1 + логарифм длины документа 2: ранг документа делится на его длину 4: ранг документа делится на среднее гармоническое расстояние между блоками (это реализовано только в ts_rank_cd) 8: ранг документа делится на число уникальных слов в документе 16: ранг документа делится на 1 + логарифм числа уникальных слов в документе 32: ранг делится своё же значение + 1 Но без понятия механизма бесполезно. Возможно настроить поиск чтобы в первую очередь выводились точные вхождения? Видится вариант с отдельным запросом LIKE и последующим исключением из второго запроса найденные товары. Но вдруг можно ограничиться одним запросом? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2018, 20:44 |
|
Ранжирование результатов поиска по точному вхождению строки
|
|||
---|---|---|---|
#18+
PavelTut, зачем отдельный запрос ? лайком задаете префикс ордербая. а можете регесп-реплейсом по длине промежности. например. и вообще если попользовать ts_parse , то всё в ваших руках. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2018, 23:35 |
|
Ранжирование результатов поиска по точному вхождению строки
|
|||
---|---|---|---|
#18+
Спасибо! Навели на нужную мысль. Просто добавил LIKE с точным вхождением названия и отсортировал второй раз. SELECT "product".name, (product.name ILIKE 'русские сказки') AS rank_name, ts_rank_cd(fts, to_tsquery('русские&сказки:abd'), 0) AS rank_all FROM "product" WHERE (to_tsquery('русские&сказки:abd') @@ fts) ORDER BY "rank_name" DESC, "rank_all" DESC LIMIT 10 Ищем как обычно, а если 'русские сказки' встречаются точно, то rank_name выдаёт true и, соответственно, выводится впереди. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2018, 05:04 |
|
|
start [/forum/topic.php?fid=53&msg=39599401&tid=1995952]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
35ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
others: | 25ms |
total: | 146ms |
0 / 0 |