Postgres полнотекстовый поиск по нескольким связанным таблицам - PullRequest
13 голосов
/ 09 февраля 2010

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

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

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

1 Ответ

8 голосов
/ 09 февраля 2010

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

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

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

...