↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

已结束支持的版本: 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3
历史版本。 PostgreSQL 9.1 已结束支持。 2016-10-27. 请参阅 当前版本手册.

F.43. tsearch2 #

tsearch2 模块为那些在文本搜索于 8.3 版集成进 PostgreSQL 核心之前使用过 tsearch2 的应用提供向后兼容的文本搜索功能。

F.43.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.43.2. 转换 8.3 之前的安装

更新一个使用 tsearch2 的 8.3 之前安装的推荐方法是:

  1. 按通常方式从旧安装中做一个转储,但务必不要使用 pg_dump 或 pg_dumpall 的 -c(--clean)选项。

  2. 在新安装中创建空数据库,并将替代的 tsearch2 模块安装到每个要使用文本搜索的数据库中。这必须在装载转储数据之前完成!如果你的旧安装把 tsearch2 对象放在了 public 以外的模式中,请务必调整 CREATE EXTENSION 命令,使替代对象创建在同一模式中。

  3. 装载转储数据。由于无法重新创建原始的 tsearch2 对象,会报告相当多的错误。这些错误可以忽略,但这意味着你不能在单个事务中恢复转储(例如,不能使用 pg_restore 的 -1 开关)。

  4. 检查恢复出的 tsearch2 配置表(pg_ts_cfg 等)的内容,并按需创建等效的内置文本搜索配置。从中提取出所有有用信息之后,就可以删除旧的配置表。

  5. 测试你的应用。

之后你也许希望把应用中对别名文本搜索对象的引用改名,以便最终卸载替代的 tsearch2 模块。

F.43.3. 参考文献

Tsearch2 开发站点 http://www.sai.msu.su/~megera/postgres/gist/tsearch/V2/

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.