Функция сходства в Postgres с pg_trgm
Я пытаюсь использовать функцию подобия в Postgres для выполнения нечеткого соответствия текста, однако всякий раз, когда я пытаюсь его использовать, я получаю ошибку:
function similarity(character varying, unknown) does not exist
Если я добавляю явные приведения к тексту, я получаю ошибку:
function similarity(text, text) does not exist
Мой запрос:
SELECT (similarity("table"."field"::text, %s::text)) AS "similarity", "table".* FROM "table" WHERE similarity > .5 ORDER BY "similarity" DESC LIMIT 10
Мне нужно что-то сделать, чтобы инициализировать pg_trgm?
Ответы
Ответ 1
Вам нужно установить pg_trgm. В debian, введите этот sql: /usr/share/postgresql/8.4/contrib/pg_trgm.sql
. Из командной строки:
psql -f /usr/share/postgresql/8.4/contrib/pg_trgm.sql
Или внутри оболочки psql:
\i /usr/share/postgresql/8.4/contrib/pg_trgm.sql
script по умолчанию устанавливается в общедоступную схему, отредактируйте путь поиска вверху, если вы хотите установить его где-то в другом месте (чтобы удаление/обновление можно было просто удалить из схемы).
Ответ 2
С postgresql 9.1:
после установки (на ubuntu) sudo apt-get install postgresql-contrib
как ответил tomaszbak.
вам просто нужно выполнить команду sql:
CREATE EXTENSION pg_trgm;
Ответ 3
На ubuntu вам нужно запустить
sudo apt-get install postgresql-contrib
чтобы получить/usr/share/postgresql/8.4/contrib/pg_trgm.sql
Ответ 4
Если у вас установлено расширение pg_trgm
не в схеме public
, вы должны явно указать схему при использовании функции similarity
, подобной этой
select schema.similarity(foo,bar) from schema.baz
Ответ 5
Для Postgres 8.4 выполните следующие действия:
Как работает пользователь sudo:
sudo apt-get install postgresql-contrib-8.4
Переключиться на пользователя postgres:
sudo su - postgres
Run:
psql -U DB_USER -d DB_NAME -f /usr/share/postgresql/8.4/contrib/pg_trgm.sql
Перезапуск postgres
Ответ 6
У меня возникла такая же проблема в контексте запуска Django Test Runner для функции, которая использует ORM Django 1.11 для сходства триграмм в Postgres 9.4.
Я должен был сделать несколько вещей, чтобы это заработало:
1) OP правильно, что для этого необходимо включить расширение pg_trgm
. Однако в postgres9.4 это включено для каждой -d атабазы. Поскольку Django удаляет и воссоздает тестовую базу данных при каждом запуске, в новой тестовой базе данных расширение не установлено. Чтобы это исправить, я инициализировал расширение pg_trgm
в новом шаблоне базы данных -c по умолчанию в postgres. Команда для этого - psql -d template1 -c 'CREATE EXTENSION pg_trgm;'
запустить как пользователь postgres
.
2) Postgres пришлось перезапустить
3) Тестер Django не распознал это, поэтому мне пришлось обновить его с 1.11.12 до 1.11.18 (возможно, это также исправлено в более новых версиях Django)