F.48. tsearch2
Модуль tsearch2 предоставляет функциональность текстового поиска для обратной совместимости с приложениями, которые использовали tsearch2 до того, как текстовый поиск был интегрирован в ядро PostgreSQL в версии 8.3.
F.48.1. Вопросы переносимости
Хотя встроенные функции текстового поиска были основаны на функциях tsearch2 и во многом похожи, есть ряд небольших различий, из-за которых возникают вопросы переносимости с существующими приложениями:
Были изменены имена некоторых функций, например функция
rank
сталаts_rank
. Модуль заменыtsearch2
предоставляет псевдонимы для старых имён.Все типы данных и функции встроенного текстового поиска существуют в системной схеме
pg_catalog
. При установке из tsearch2 эти объекты обычно помещались в схемуpublic
, хотя некоторые пользователи могли поместить их в специальную отдельную схему. Таким образом, ссылки на объекты, дополненные схемой, окажутся нерабочими в любом случае. Модуль заменыtsearch2
предоставляет для этих объектов псевдонимы, которые помещаются в схемуpublic
(или другую, если это требуется), чтобы такие ссылки продолжали работать.Для встроенных функций текстового поиска отсутствуют понятия «текущий анализатор» и «текущий словарь», есть только текущая конфигурация поиска (она задаётся параметром
default_text_search_config
). Хотя текущий анализатор и текущий словарь использовались раньше только функциями, предназначенными для отладки, это всё же может мешать переносимости в некоторых случаях. Модуль заменыtsearch2
имитирует эти дополнительные переменные состояния и предоставляет обратно-совместимые функции, позволяющие задать и прочитать их.
Есть ряд проблем, решения которых не предлагает модуль tsearch2
, так что код приложения придётся корректировать в любом случае:
Старая триггерная функция
tsearch2
могла принимать в списке аргументов имена функций, вызываемых с текстовыми данными до того, как они были преобразованы в форматtsvector
. Эта возможность была ликвидирована как угроза безопасности, так как нельзя гарантировать, что вызываться будет именно запланированная функция. Если данные нужно как-то обработать перед индексацией, рекомендуется написать дополнительный триггер, который будет делать это сам.Информация о конфигурации текстового поиска была перенесена в системные каталоги, которые значительно отличаются от таблиц аналогичного предназначения в tsearch2. Все приложения, анализирующие или модифицирующие эти таблицы, нуждаются в корректировке.
Ели приложение использует какие-либо нестандартные конфигурации текстового поиска, их нужно будет настроить в системных каталогах, применив новые SQL-команды конфигурирования текстового поиска. Модуль замены
tsearch2
предлагает небольшую помощь в этом, позволяя загружать старый набор конфигурационных таблиц tsearch2 в PostgreSQL 8.3. (Без этого модуля загрузить данные конфигурации невозможно, так как значения в столбцахregprocedure
нельзя сопоставить с функциями.) Эти таблицы конфигурации на самом деле не будут ничего делать, но их содержимое будет полезно хотя бы для того, чтобы получить аналогичную конфигурацию в 8.3.Старые функции
reset_tsearch()
иget_covers()
не поддерживаются.Модуль замены
tsearch2
не определяет никакие псевдонимы операторов, полностью рассчитывая на встроенные. Это может вызвать проблемы, если в приложении использовались имена операторов с явным указанием схемы, что встречается очень редко.
F.48.2. Преобразование инсталляции версии до 8.3
Обновлять инсталляцию версии до 8.3, в которой использовалось расширение tsearch2, рекомендуется следующим образом:
Выгрузите данные старой инсталляции обычным способом, не используя ключ
-c
(--clean
) программы pg_dump или pg_dumpall.В новой инсталляции создайте пустые базы данных и установите модуль замены
tsearch2
в каждую базу, где будет использоваться текстовый поиск. Это нужно сделать до загрузки данных в базу! Если в старой инсталляции объекты tsearch2 содержались в схеме, отличной отpublic
, обязательно отразите это в командеCREATE EXTENSION
, чтобы заменяющие объекты создавались в той же схеме.Загрузите выгруженные данные. При этом могут возникнуть ошибки из-за невозможности воссоздать первоначальные объекты tsearch2. Хотя их можно игнорировать, это значит, что вы не сможете восстановить выгруженные данные в одной транзакции (то есть, нельзя использовать ключ
-1
команды pg_restore).Изучите содержимое восстановленных конфигурационных таблиц tsearch2 (
pg_ts_cfg
и т. д.) и создайте аналогичные конфигурации текстового поиска по потребности. Получив из старых конфигурационных таблиц всю полезную информацию, вы можете удалить их.Протестируйте работу приложения.
Позже вы можете поменять ссылки в приложении на псевдонимы объектов текстового поиска, что позволит в конце концов удалить модуль замены tsearch2
.
F.48.3. Ссылки
Сайт разработки Tsearch2 http://www.sai.msu.su/~megera/postgres/gist/tsearch/V2/