Django Полнотекстовый поискVectorField устарел в PostgreSQL - PullRequest
2 голосов
/ 10 января 2020

Я использую Django встроенный полнотекстовый поиск с PostgreSQL.

В документах Django говорится, что производительность можно улучшить с помощью SearchVectorField. Это поле содержит предварительно сгенерированный столбец ts_vector со всеми соответствующими лексемами рядом с моделью, а не генерирует его на лету при каждом поиске.

Однако при таком подходе ts_vector должен обновляться всякий раз, когда обновляется модель. Чтобы сохранить его синхронизацию, в документах Django предлагается использовать «триггеры», и обратитесь к документации PostgreSQL для получения более подробной информации.

Однако сами документы PostgreSQL говорят, что подход триггера теперь устаревшее . Вместо того, чтобы вручную обновлять столбец ts_vector, лучше автоматически обновлять столбец, используя сохраненный сгенерированный столбец .

Вопрос: Как могу ли я использовать PostgreSQL рекомендуемый подход с Django?

Мое текущее решение не идеально: используйте SearchVectorField для создания столбца, а затем вручную go в PostgreSQL и замените сгенерированный столбец Django на сохраненный сгенерированный столбец. Есть ли лучший способ?

1 Ответ

1 голос
/ 10 января 2020

Основываясь на подсказке от этого блога , я понял, что лучшим способом было бы создать поле пользовательской модели , которое подклассов SearchVectorField, чтобы создать сохраненный сгенерированный столбец. Это потребовало бы некоторого пользовательского SQL в соответствии с инструкциями в PostgreSQL документах .

Однако я на самом деле не реализовал это, поскольку я также понял, что не использую PostgreSQL 12, поэтому у меня пока нет возможности использовать эту функцию! Сейчас я буду придерживаться триггеров, используя этот SO-ответ для руководства.

...