Postgres полнотекстовый поиск по нескольким связанным таблицам

Это может быть очень упрощенный вопрос, поэтому заранее извиняюсь, но я очень новичок в использовании базы данных.

Я хотел бы, чтобы Postgres выполнял полнотекстовый поиск по нескольким объединенным таблицам. Представьте себе что-то вроде пользователя модели со связанными моделями UserProfile и UserInfo. Поиск будет только для пользователей, но будет включать информацию из UserProfile и UserInfo.

Я планирую использовать индекс Джина для поиска. Однако мне неясно, Мне понадобится отдельный столбец tsvector в таблице User для хранения агрегированных tsvectors из разных таблиц и для настройки триггеров, чтобы поддерживать его в актуальном состоянии. Или если можно создать индекс без столбца tsvector, который будет обновляться при каждом изменении любого из соответствующих полей в любой из соответствующих таблиц. Кроме того, любые советы по синтаксису команды для создания всего этого также будут высоко оценены.

1 ответов


ваш лучший ответ, вероятно, должен иметь отдельный столбец tsvector в каждой таблице (с индексом, конечно). Если вы агрегируете данные до общего tsvector,это создаст много обновлений на этом общем при каждом обновлении отдельных.

вам понадобится один индекс в таблице. Затем, когда вы запрашиваете его, очевидно, вам нужно несколько предложений WHERE, по одному для каждого поля. PostgreSQL автоматически определит, какую комбинацию индексов использовать, чтобы дать вам самые быстрые результаты-вероятно, с помощью растрового сканирования. Это сделает ваши запросы немного более сложными для записи (так как вам нужно несколько предложений сопоставления столбцов), но это сохраняет гибкость для запроса только некоторых полей в тех случаях, когда вы хотите.

вы не можете создать один индекс, который отслеживает несколько таблиц. Для этого вам нужен отдельный столбец tsvector и триггеры для каждой таблицы, чтобы обновить его.