#postgresql #full-text-search #immutability
Вопрос:
Я пытаюсь создать индекс для текстового поиска в Postgres, но я продолжаю получать сообщение об ошибке при создании сгенерированного столбца tsvector.
ERROR: generation expression is not immutable
SQL state: 42P17
У меня есть столбец «заголовок» текста и столбец «авторы» текста []. Я пытаюсь объединить их, чтобы создать столбец tsvector
Вот код, который выдает ошибку
ALTER TABLE book
ADD COLUMN tscol tsvector
GENERATED ALWAYS AS (to_tsvector(title || ' ' || immutable_array_to_string(coalesce(authors, '{}'), ' '))) STORED;
Код для функции immutable_array_to_string:
CREATE OR REPLACE FUNCTION immutable_array_to_string(text[], text)
RETURNS text as $ SELECT array_to_string($1, $2); $
LANGUAGE sql IMMUTABLE;
Ответ №1:
Вы звоните to_tsvector
без a regconfig
, поэтому используется значение по умолчанию. В таком случае функция является единственной stable
. Если вы хотите, чтобы он был неизменным, вы должны пройти regconfig
.
to_tsvector('english',title || ' ' || immutable_array_to_string(coalesce(authors, '{}'), ' '))
PS: вы можете позвонить df to_tsvector
, чтобы увидеть изменчивость функции с разными сигнатурами.
Комментарии:
1. Спасибо!!! Теперь я вижу свою ошибку. Также спасибо за совет df to_tsvector :)))