开发者社区 问答 正文

使用Brew安装的PostgreSQL 11.5,在添加pg_trgm后还是没法搜索中文

关于pg_trgm对中午无法生效的问题

1. 创建数据库

create database test with template template0 lc_collate "zh_CN.UTF-8" lc_ctype "zh_CN.UTF-8" encoding 
'UTF8';

2. 添加插件

create extension pg_trgm;

3. 查看效果

select show_trgm('你好');

查询结果为空,我需要如何设置才能使trgm插件对中文生效。

展开
收起
柳叶清 2019-10-04 22:26:49 924 分享 版权
阿里云 AI 助理回答

pg_trgm 是 PostgreSQL 的一个扩展,主要用于文本相似度的计算,特别适用于基于前缀、后缀以及子串的快速比较。然而,它主要是针对字符而不是语义进行比较,且默认配置主要对英文字符优化。对于中文字符,由于其编码和分词特性,直接使用可能不会像预期那样工作。

如果你希望在中文环境下使用 pg_trgm 扩展并获得有效结果,可以尝试以下步骤来调整或增强其对中文的支持:

  1. 确保数据库字符集正确:你已经创建了一个使用 "zh_CN.UTF-8" 作为排序规则和字符类型的数据库,这是正确的第一步,确保了中文字符能够被正确存储和处理。

  2. 了解 pg_trgm 工作原理pg_trgm 主要通过生成字符串的三元组(即连续字符的3字符组合)来进行相似度比较。对于非空格分隔的语言如中文,这种机制可能不是最理想的,因为中文词语之间没有明显的分隔符,导致生成的三元组可能不那么有意义。

  3. 自定义分词处理:为了使 pg_trgm 更好地服务于中文文本,你可以考虑先对中文文本进行分词处理,然后再应用 pg_trgm。PostgreSQL 社区有一些针对中文分词的插件,比如 ictu 或者结合外部工具如 jieba 分词后将结果存入数据库再进行比较。但请注意,这通常涉及到更复杂的预处理逻辑,并非直接使用 pg_trgm 所能解决。

  4. 查询为空问题show_trgm 函数实际上并不直接展示文本的三元组信息,而是用于查看特定表列上是否启用了 GIN 或 GiST 索引以支持 pg_trgm 操作。所以,你的查询结果为空是正常的,这不代表 pg_trgm 不能处理中文,而是这个函数的用法不对。

  5. 实际应用示例:如果你想比较两个中文字符串的相似度,可以直接使用 similarity()word_similarity() 函数(如果适用),例如:

    SELECT similarity('你好', '您好');
    

    但是,请记住,对于中文来说,这样的比较可能不如专门的中文分词和相似度算法准确。

综上所述,若想在中文环境下高效利用 pg_trgm,可能需要结合额外的中文处理策略,或者探索更适合中文文本处理的其他方法或扩展。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答