#postgresql #full-text-search #ranking
#postgresql #полнотекстовый поиск #Рейтинг
Вопрос:
Привет, я хотел бы определить запрос для полнотекстового поиска PostgreSQL таким образом, чтобы результаты, соответствующие всем терминам, ранжировались выше, в то время как результаты, соответствующие только некоторым терминам, также извлекаются.
Пример:
запрос: tree wood
Я хотел бы получить результаты, включающие оба слова в более высоких рангах. Тем не менее, я также хотел бы получить результаты, включающие только tree
or wood
.
Я пытался использовать plainto_tsquery ('tree | wood')
, но это не определяет приоритет записей, включая все условия запроса.
У меня есть введенный столбец базы ts_vector
данных, и я выполняю поиск по этому столбцу.
Заранее спасибо за ваши ответы.
Решение: я смог достичь того, чего я хочу, после явной сортировки результатов по рангу с помощью чего-то вроде:
select * from table, to_tsquery('english', 'wood | tree') query where vector_column @@ query order by ts_rank_cd(search_index, query) desc;
Комментарии:
1. Запустите два запроса: один с
'tree amp; wood'
и один с'tree | wood'
. Отображение результатов первого запроса с более высоким рангом.
Ответ №1:
Встроенные функции ранжирования ts_rank
и ts_rank_cd
должны делать это автоматически. Обратите внимание , что запрос , отправляемый в функции ранжирования , должен быть тем |
, в котором указано , а не amp;
.
Обратите внимание, что, вероятно, будет быстрее сначала выполнить amp;
запрос, а затем выполнить |
запрос, только если первый не нашел строк. Но, конечно, тогда вы не получите никаких |
строк, если есть хотя бы одна amp;
строка, поэтому вам нужно решить, приемлемо ли это.