Используя pg_search с жемчужиной квартиры

Я пытаюсь использовать драгоценный камень pg_search в сочетании с многопользовательским приложением, включенным жемчужиной квартиры. Квартира разделяет мои данные со схемой на каждого арендатора. Поиск в каждом арендаторе хорошо работает с настройками по умолчанию pg_search, но у меня возникают проблемы при использовании его с включенным pg_trgm.

Я включил расширение pg_trgm в моей базе данных, добавив отдельную схему под названием "общие расширения" и включив в нее расширение pg_trgm. Эта схема всегда включена в путь поиска путем настройки квартиры:

config.persistent_schemas = %w{ shared_extensions }

Но когда я пытаюсь выполнить поиск по триграмме для модели, я получаю сообщение об ошибке.

pg_search_scope :search_by_name, against: :name, using: :trigram

Meeting.search_by_name('blabla').first

PG::UndefinedFunction: ERROR:  operator does not exist: text % unknown

Это заставляет меня думать, что pg_trgm не был правильно включен, однако я могу выполнить следующий запрос к моей базе данных очень хорошо:

SELECT name, similarity(name, 'blabla') AS sml
FROM aa.meetings
WHERE name % 'blabla'
ORDER BY sml DESC, name;

Любая помощь будет оценена! Спасибо

1 ответ

Решение

Я узнал, что случилось. Возможно, когда-нибудь это может кому-нибудь помочь.

Хотя у вас может быть много схем для базы данных Postgres, вы можете включить расширения только в одной из схем. У меня уже был включен pg_trgm для схемы, которая не была включена в каждый путь поиска, поэтому установка расширения для схемы shared_extensions завершилась неудачно.

Я изменил задание по рейку на это:

namespace :db do

desc 'Create shared_extensions Schema'
  task :extensions => :environment  do
    ActiveRecord::Base.connection.execute 'DROP EXTENSION IF EXISTS "pg_trgm"'
    ActiveRecord::Base.connection.execute 'CREATE SCHEMA IF NOT EXISTS shared_extensions;'
    ActiveRecord::Base.connection.execute 'CREATE EXTENSION "pg_trgm" SCHEMA shared_extensions;'
  end
end

Rake::Task["db:create"].enhance do
  Rake::Task["db:extensions"].invoke
end

Rake::Task["db:test:purge"].enhance do
  Rake::Task["db:extensions"].invoke
end
Другие вопросы по тегам