PostgreSQL 9.4.4 中文手册
上一页 | 上一级 | 附录 F. 额外提供的模块 | 下一页

# F.42. tsearch2

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

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

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

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

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

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

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

5. 测试你的应用。

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

## F.42.3. 参考文献

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

上一页 | 起始页 | 下一页
test_shm_mq | 上一级 | unaccent