pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
tsearch2 模块为那些在文本搜索于 8.3 版集成进 PostgreSQL 核心之前使用过 tsearch2 的应用提供向后兼容的文本搜索功能。
尽管内置的文本搜索特性以 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 模块没有定义任何别名操作符, 而是完全依赖内置操作符。只有当应用使用了显式模式限定的操作符名称时 这才会成为问题,而这种情况非常少见。
更新一个使用 tsearch2 的 8.3 之前安装的推荐方法是:
按通常方式从旧安装中做一个转储,但务必不要使用 pg_dump 或 pg_dumpall 的 -c(--clean)选项。
在新安装中创建空数据库,并将替代的 tsearch2 模块安装到 每个要使用文本搜索的数据库中。这必须在装载转储数据之前 完成!如果你的旧安装把 tsearch2 对象放在了 public 以外的模式中,请务必调整 CREATE EXTENSION 命令,使替代对象创建在同一模式中。
装载转储数据。由于无法重新创建原始的 tsearch2 对象,会报告相当多的错误。这些错误可以忽略,但这意味着你不能在单个事务中 恢复转储(例如,不能使用 pg_restore 的 -1 开关)。
检查恢复出的 tsearch2 配置表 (pg_ts_cfg 等)的内容,并按需创建等效的内置 文本搜索配置。从中提取出所有有用信息之后,就可以删除旧的配置表。
测试你的应用。
之后你也许希望把应用中对别名文本搜索对象的引用改名,以便最终卸载替代的 tsearch2 模块。
Tsearch2 开发站点 http://www.sai.msu.su/~megera/postgres/gist/tsearch/V2/
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。