使用ICU边界分析的PostgreSQL文本搜索解析器
全文搜索的第一阶段是解析 - 将文档和查询文本打破单个令牌(不同的单词,数字等)。但是,在某些语言中,此任务并不那么微不足道。最突出的例子是东亚语言(例如中文,日语,韩语等) - 通常,言语通常不会被空间和标点符号隔开。另一个例子是希伯来语。虽然单词被标点符号隔开,但某些字符可能被视为标点符号,或者不取决于上下文。
PostgreSQL的全文搜索子系统随附的默认解析器在这些情况下提供了相当不满意的结果。 pg_icu_parser是一个扩展程序,它提供了一种自定义的全文搜索解析器实现,该实现使用ICU Word边界分析例程从源文本中提取令牌。这些实现了Unicode标准附件29中指定的算法,并可以在许多语言上提供合理的结果。
当前必须从源代码构建pg_icu_parser 。确保可用的PostgreSQL有开发支持文件(标题等)。
要构建和安装,请运行:
$ make install
这将违反并安装到当前路径中的pg_config的第一个实例确定的PostgreSQL安装中。针对特定的安装(或一个不在路径中):
$ make install PG_CONFIG=/path/to/pg_config
该扩展名也可在PGXN中获得。
要将扩展名加载到数据库中,请作为具有合适权限的用户执行以下SQL命令:
CREATE EXTENSION pg_icu_parser;这将在当前架构中注册自定义文本解析器。为了使用它,必须如PostgreSQL手册中所述创建文本搜索配置。例如:
CREATE TEXT SEARCH CONFIGURATION sample (parser = icu_parser);
ALTER TEXT SEARCH CONFIGURATION sample ADD MAPPING FOR word WITH english_stem;
ALTER TEXT SEARCH CONFIGURATION sample ADD MAPPING FOR number , ideo, kana WITH simple;可以通过解析器发射的令牌类型是word , number , kana , ideo和blank这些类型与ICU支持的单词断路标签保持一致。对于可以使用哪些字典没有限制。
pg_icu_parser公开一个配置参数:
pg_icu_parser.locale字符串,可选。与边界分析例程一起使用的ICU区域。如果未设置,则默认为en 。通常,不需要设置此参数,因为没有对语言环境敏感的单词边界检测规则。 如上所述, pg_icu_parser与已内置在PostgreSQL中的default解析器的主要优势是各种语言中更好的令牌化结果。此外, pg_icu_parser不取决于数据库的语言环境设置或用于确定字母的基础操作系统。
但是,有几个权衡要意识到这会影响决策是否适合pg_icu_parser用例:
默认解析器可以识别多种模式,例如令牌,包括URL,电子邮件地址,各种不同种类的数字值等。另一方面, pg_icu_parser标记类型要少得多(并且支持的少数人更粗糙),并且无法检测到任何复杂的模式。
目前, pg_icu_parser不支持ts_headline函数。也许将来...
pg_icu_parser比default解析器慢得多。但是,如果数据库的服务器编码为UTF-8,则使用快速路径,从而减少开销。请参阅下面的基准部分。
作为第三方扩展程序,只有在可以完全控制PostgreSQL安装的地方,才能使用pg_icu_parser ;也就是说,它可能无法与托管的PostgreSQL解决方案一起使用。
以下非科学基准可以使人对使用pg_icu_parser而不是默认解析器所期望的速度降低多少。经过测试的方案是计算语料库中每个文档中非空白令牌数量的查询。使用的语料库是Haaretz语料库,由27,139个简短的希伯来语文章组成。值是10发毫秒的平均执行时间,如说明EXPLAIN ANALYZE所报道:
| 服务器编码 | default | pg_icu_parser | 减速 |
|---|---|---|---|
| UTF-8 | 2,566.9974 | 2,884.3696 | -12.3% |
| ISO-8859-8 | 3,529.6487 | 5,059.3616 | -43.3% |
当然,不同的环境和不同的语料库可能会产生不同的结果,YMMV。
pg_icu_parser已获得Mozilla公共许可2.0的许可。