版本:
目录导航
tsearch2

F.39. tsearch2

tsearch2模块为在文本搜索整合到内核PostgreSQL 版本8.3之前的应用提供后向兼容的文本搜索功能。

F.39.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.39.2. 转换一个8.3之前的安装

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

  1. 以普通的方式从老的安装中做一个转储,但是确保不要使用pg_dumppg_dumpall-c (--clean)选项。

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

  3. 加载转储数据。将会报告一些错误,因为未能重新创建原来的tsearch2对象。 可以忽略这些错误,但是这意味着你不能在单个事务中恢复转储 (例如,你不能使用pg_restore-1开关)。

  4. 检查恢复的tsearch2配置表的内容(pg_ts_cfg等), 并根据需要创建相等的内建文本搜索配置。你可能会在提取了所有有用的信息之后删除旧的配置表。

  5. 测试你的应用。

稍后你可能希望重命名应用引用到别名文本搜索对象, 这样你可以最后卸载替换的tsearch2模块。

<
/BODY >