使用PostgreSQL数据库进行中文全文搜索的实现方法

 更新时间:2023年09月25日 10:33:41   作者:undefinedType  
目前在PostgreSQL中常见的两个中文分词插件是zhparser和pg_jieba,这里我们使用zhparser,插件的编译和安装请查看官方文档 ,安装还是比较复杂的,建议找个现成docker镜像,本文给大家介绍了在PostgreSQL数据库使用中文全文搜索,需要的朋友可以参考下

如何使用zhparser

安装相应插件

1 安装 pg_trgm

用于执行文本相似性和模糊搜索。它基于 trigram 算法,允许你在文本数据上执行模糊匹配、相似性搜索和索引。命令如下

CREATE EXTENSION pg_trgm

2 安装 zhparser

专门用于处理中文文本数据。它允许 PostgreSQL 在中文文本上执行全文搜索,包括分词、词干提取、停用词处理等操作,以便提高中文文本数据的搜索准确性和性能。命令如下

CREATE EXTENSION zhparser

创建基于zhparser的搜索配置

CREATE TEXT SEARCH CONFIGURATION chinese_zh (PARSER = zhparser)

这个命令创建了一个名为 chinese_zh 的中文文本搜索配置。该配置使用了 zhparser 解析器,表明它将用于分析和处理中文文本数据。

ALTER TEXT SEARCH CONFIGURATION chinese_zh ADD MAPPING FOR n,v,a,i,e,l WITH simple

这个命令将指定的词汇类别(n,v,a,i,e,l)与已存在的 simple 配置进行映射。这意味着对于这些词汇类别,将使用 simple 配置的规则来进行文本分析和处理。

进行搜索查询

select ts_debug('chinese_zh', '春秋、战国是中国历史上思想迸发的时代,出现了百家争鸣的现象');

执行结果:

"(t,""time,时语素"",春秋,{},,)"
"(u,""auxiliary,助词"",、,{},,)"
"(t,""time,时语素"",战国,{},,)"
"(v,""verb,动词"",是,{simple},simple,{是})"
"(n,""noun,名词"",中国,{simple},simple,{中国})"
"(n,""noun,名词"",历史,{simple},simple,{历史})"
"(n,""noun,名词"",上思,{simple},simple,{上思})"
"(v,""verb,动词"",想,{simple},simple,{想})"
"(v,""verb,动词"",迸发,{simple},simple,{迸发})"
"(u,""auxiliary,助词"",的,{},,)"
"(n,""noun,名词"",时代,{simple},simple,{时代})"
"(u,""auxiliary,助词"",,,{},,)"
"(v,""verb,动词"",出现,{simple},simple,{出现})"
"(v,""verb,动词"",了,{simple},simple,{了})"
"(n,""noun,名词"",百家争鸣,{simple},simple,{百家争鸣})"
"(u,""auxiliary,助词"",的,{},,)"
"(n,""noun,名词"",现象,{simple},simple,{现象})"
select to_tsvector('chinese_zh', '春秋、战国是中国历史上思想迸发的时代,出现了百家争鸣的现象');

执行结果:

"'上思':4 '中国':2 '了':9 '出现':8 '历史':3 '想':5 '时代':7 '是':1 '现象':11 '百家争鸣':10 '迸发':6"

可以看到春秋和战国没有出现在里面,这里我们把t,time,时语素的映射添加下

ALTER TEXT SEARCH CONFIGURATION chinese_zh ADD MAPPING FOR t WITH simple;

再执行上面的语句就会得到下面的结果

"'上思':6 '中国':4 '了':11 '出现':10 '历史':5 '想':7 '战国':2 '时代':9 '春秋':1 '是':3 '现象':13 '百家争鸣':12 '迸发':8"

可以看到春秋和战国已经出现在文本向量的结果中了。我们搜索下春秋看下

select to_tsquery('战国') @@ to_tsvector('chinese_zh', '春秋、战国是中国历史上思想迸发的时代,出现了百家争鸣的现象');

true

添加自定义词典(txt)

select to_tsquery('二十四节谷') @@  to_tsvector('chinese_zh', '春秋、战国是中国历史上思想迸发的时代,在二十四节谷出现了百家争鸣的现象');
false

这里竟然没有,仔细观察上面对这个句子的向量化分析,破案了,没有把‘二十四节谷’这个词作为一个整体

'上思':6 '中国':4 '了':11 '出现':10 '历史':5 '想':7

在以下位置创建客户字典/usr/share/postgresql/14/tsearch_data/kkdict.utf8.txt:(必须在该目录中)

#word TF  IDF ATTR
二十四节谷  1 1 n

然后修改/var/lib/postgresql/data/posrgresql.conf,在末尾添加以下行: zhparser.extra_dicts = 'kkdict.utf8.txt'

select ts_debug('chinese_zh', '春秋、战国是中国历史上思想迸发的时代,在二十四节谷出现了百家争鸣的现象');
(n,"noun,名词",二十四节谷,{simple},simple,{二十四节谷})

可见现在已经变成一个名词了。

创建索引

这里使用to_tsvector函数方式,不单独增加一列tsvector字段

create table testing(
  title text
  );
  insert into testing values('春秋、战国是中国历史上思想迸发的时代,出现了百家争鸣的现象');
  insert into testing values('春秋、战国是中国历史上思想迸发的时代,在二十四节谷出现了百家争鸣的现象');
create index ind_testing on testing using gin (to_tsvector('chinese_zh', title));

这样就可以在查询中使用中文检索了,注意当你数据量不够的时候不会走索引,会直接便利。

select * from testing where to_tsquery('chinese_zh', '二十四节谷') @@ to_tsvector('chinese_zh', title);

总结

以上就是在PostgreSQL数据库中使用中文全文搜索的实现方法的详细内容,更多关于PostgreSQL中文全文搜索的资料请关注脚本之家其它相关文章!

相关文章

  • Postgresql数据库SQL字段拼接方法

    Postgresql数据库SQL字段拼接方法

    Postgresql里面内置了很多的实用函数,下面这篇文章主要给大家介绍了关于Postgresql数据库SQL字段拼接方法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • PostgreSQL优雅的进行递归查询的实战指南

    PostgreSQL优雅的进行递归查询的实战指南

    在实际开发中,我们经常会遇到树形结构或图结构的数据需求,这些场景的核心问题是:如何高效查询具有层级/递归关系的数据?所以本文将从基础到实战,手把手教你掌握递归查询的精髓,需要的朋友可以参考下
    2026-01-01
  • 将PostgreSQL的数据实时同步到Doris的技巧分享

    将PostgreSQL的数据实时同步到Doris的技巧分享

    众所周知,在两个毫不相干的数据管理系统之间进行数据同步,特别是实时同步,其复杂程度足以让高级DBA脑瓜疼,本文给大家介绍了将PostgreSQL的数据实时同步到Doris的技巧分享,需要的朋友可以参考下
    2024-03-03
  • Windows 安装 PostgreSQL 并安装 vector 扩展的流程

    Windows 安装 PostgreSQL 并安装 vector 扩展

    文章详细指导了在Windows系统上安装PostgreSQL并配置Vector扩展的全过程,涵盖安装流程、环境优化、扩展部署、数据库设置及功能验证,同时提供常见问题排查和版本/内存优化建议,对PostgreSQL安装 vector 扩展相关知识感兴趣的朋友一起看看吧
    2025-07-07
  • Postgresql查询效率计算初探

    Postgresql查询效率计算初探

    这篇文章主要给大家介绍了关于Postgresql查询效率计算的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Postgresql具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • PostgreSQL长事务概念解析

    PostgreSQL长事务概念解析

    pg中的长事务会影响表中垃圾回收,导致表的年龄增长无法freeze。能消耗事务的只有当执行了一些DML或者DDL操作后才能算是我们通常说的长事务。否则只能算是我们常说的长连接,当然长连接也有很多弊端,例如占用内存、cpu等资源
    2022-09-09
  • PostgreSQL数据库事务插入删除及更新操作示例

    PostgreSQL数据库事务插入删除及更新操作示例

    这篇文章主要为大家介绍了PostgreSQL事务的插入删除及更新操作示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • PostgreSQL ROW_NUMBER() OVER()的用法说明

    PostgreSQL ROW_NUMBER() OVER()的用法说明

    这篇文章主要介绍了PostgreSQL ROW_NUMBER() OVER()的用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • PostgreSQL数据DML误操作恢复方法

    PostgreSQL数据DML误操作恢复方法

    PostgreSQL是一种开源的对象关系型数据库管理系统,其DML(Data Manipulation Language)负责数据的操作和管理,那么如何DML误操作了如何恢复,所以本文介绍了PostgreSQL数据DML误操作恢复方法,需要的朋友可以参考下
    2024-12-12
  • postgreSQL数据库默认用户postgres常用命令分享

    postgreSQL数据库默认用户postgres常用命令分享

    这篇文章主要介绍了postgreSQL数据库默认用户postgres常用命令分享,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01

最新评论