Подтвердить что ты не робот

Полнотекстовый поиск Postgres через несколько связанных таблиц

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

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

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

4b9b3361

Ответ 1

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

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

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