Ошибка полнотекстового поиска Postgres при использовании setweight()
У меня PostgreSQL 9.6.8 работает на Fedora 27 64bit. Когда я выполняю этот запрос:
UPDATE tbl SET textsearchable_index_col =
setweight(to_tsvector('french', coalesce("col1",'')), 'D') ||
setweight(to_tsvector('french', coalesce("col2",'')), 'D');
Я получаю эту ошибку:
ERROR: cache lookup failed for function 3625
********** Error **********
ERROR: cache lookup failed for function 3625
SQL state: XX000
но когда я выполню либо:
UPDATE tbl SET textsearchable_index_col =
setweight(to_tsvector('french', coalesce("col1",'')), 'D');
или же
UPDATE tbl SET textsearchable_index_col =
setweight(to_tsvector('french', coalesce("col2",'')), 'D');
Я получил:
Query returned successfully: 0 rows affected, 11 msec execution time.
У меня вопрос, почему он работает для каждой колонки по отдельности, но не работает, когда вместе? Эта ссылка показывает, что должно быть возможно использовать оба столбца в одном запросе (в конце раздела 12.3.1).
Изменить: вот что система возвращает для запросов Лоренца. Первый запрос возвращает
oprname | oprleft | oprright | oprcode
---------+----------+----------+----------
|| | tsvector | tsvector | 3625
Второй запрос возвращает пустой набор результатов.
1 ответ
Ваша база данных повреждена, и вам не хватает функции tsvector_concat
которая является функцией позади ||
оператор.
Вот как это должно выглядеть на здоровой системе:
SELECT oprname, oprleft::regtype, oprright::regtype, oprcode
FROM pg_operator
WHERE oid = 3633;
oprname | oprleft | oprright | oprcode
---------+----------+----------+-----------------
|| | tsvector | tsvector | tsvector_concat
(1 row)
SELECT proname, proargtypes::regtype[], prosrc
FROM pg_proc
WHERE oid = 3625;
proname | proargtypes | prosrc
-----------------+---------------------------+-----------------
tsvector_concat | [0:1]={tsvector,tsvector} | tsvector_concat
(1 row)
Вторая часть отсутствует в вашем случае.
Вы должны восстановить из резервной копии.
Попробуйте выяснить, как вы попали в этот беспорядок, чтобы вы могли избежать его в будущем.