F.56. tsearch2
Модуль tsearch2 предоставляет функциональность текстового поиска для обратной совместимости с приложениями, которые использовали tsearch2 до того, как текстовый поиск был интегрирован в ядро PostgreSQL в версии 8.3.
F.56.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.56.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.56.3. Ссылки
Сайт разработки Tsearch2 http://www.sai.msu.su/~megera/postgres/gist/tsearch/V2/