PostgreSQL 9.3.1 中文手册 | ||||
---|---|---|---|---|
Prev | Up | Appendix F. 额外提供的模块 | Next |
tsearch2模块为在文本搜索整合到内核PostgreSQL 版本8.3之前的应用提供后向兼容的文本搜索功能。
尽管内建的文本搜索功能基于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 模块到每个将要使用文本搜索的数据库。这必须在加载转储数据之前完成! 如果你的旧安装在除了public之外的一个模式中有tsearch2对象, 确保调整CREATE EXTENSION命令,这样替换的对象在相同的模式中创建。
加载转储数据。将会报告一些错误,因为未能重新创建原来的tsearch2对象。 可以忽略这些错误,但是这意味着你不能在单个事务中恢复转储 (例如,你不能使用pg_restore的-1开关)。
检查恢复的tsearch2配置表的内容(pg_ts_cfg等), 并根据需要创建相等的内建文本搜索配置。你可能会在提取了所有有用的信息之后删除旧的配置表。
测试你的应用。
稍后你可能希望重命名应用引用到别名文本搜索对象, 这样你可以最后卸载替换的tsearch2模块。