Полнотекстовый поиск PostgreSQL — приоритет результатов для результатов, соответствующих всем терминам

#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; строка, поэтому вам нужно решить, приемлемо ли это.