Postgres полнотекстовый поиск: несколько столбцов, кросс-таблица
Я новичок в Postgres и наткнулся на функцию полнотекстового поиска. Я хочу добиться следующего:
- Укажите таблицу и поля для поиска.
- Когда пользователь ищет какой-либо текст, его следует искать в указанных выше полях таблицы.
например
CREATE TABLE customer (name text)
CREATE TABLE address (city text)
Поиск "Ram" должен найти как имя "Ram*", так и город "Ram*" (может быть максимум 10 записей).
Открытая точка: рейтинг.
Я понимаю, что это может быть не просто, но если вы можете привести пример заявления для достижения аналогичного?
2 ответа
Это достаточно хорошо описано в документации PostgreSQL по полнотекстовому поиску, в которой приведены примеры поиска по нескольким столбцам и их взвешивания.
Смотрите, в частности, контроль полнотекстового поиска и манипулирования документами. Ранжирование также прямо здесь, в результатах поиска рейтинга.
Вы не предоставили достаточно информации, чтобы сказать гораздо больше. Для поиска по нескольким таблицам вы обычно хотите JOIN
Затем таблицы запрашивают их или, для лучшей производительности, создают поддерживаемое триггером материализованное представление, которое можно проиндексировать, а затем запрашивают его.
Если таблицы независимы и не связаны, не имеет смысла запрашивать их в одном запросе; для этого вы обычно используете несколько запросов tsearch2. Я думаю, что возможно, что вы могли UNION ALL
результаты запроса затем ранжируют их, но нет никакой гарантии, что ранжирование будет согласованным между двумя таблицами.
Следующее решение подходит для простых форм поиска по табличным данным , где нужно выполнять поиск по нескольким столбцам или составным столбцам:
SELECT * FROM table t
WHERE t.description ILIKE '%search criteria from the form' OR
t.text ILIKE '%search criteria from the form%' OR
t.amount ILIKE '%search criteria from the form%' OR
CONCAT(t.description, ' ', t.text, ' ', t.amount) ILIKE '%search criteria from the form%';
Таким образом, используя функцию CONCAT с комбинацией жестко запрограммированных разделителей для составного столбца и ИЛИ для поиска по нескольким столбцам.