一、模糊查询
在数据库中LIKE %的模糊查询是比较常用的一种方式,但有些场景可能用不到索引。
磐维2.0里可以使用pg_zhtrgm插件结合gin索引加速文本模糊查询。该插件提供了多种用于字母数字文本相似度匹配的函数和操作符,可以简化全文索引的使用方式。
pg_zhtrgm的使用示例如下:
create extension pg_zhtrgm;
create table t_full_text(id int, info text);
insert into t_full_text values (1, '磐维数据库是中国移动信息技术中心首个基于中国本土开源数据库打造的面向ICT基础设施的自研数据库产品。其产品内核能力基于华为openGauss开源软件,并进一步提升了系统稳定性。');
对表创建gin索引或gist索引:
create index idx_full_text1 on t_full_text using gin(info gin_zhtrgm_ops);
create index idx_full_text2 on t_full_text using gist(info gist_zhtrgm_ops);
接着可以进行单字、词语、短句的全文搜索:
select * from t_full_text where info like '%磐%';
select * from t_full_text where info like '%磐维%';
select * from t_full_text where info like '%磐维数据库是中国移动信息技术中心首个基于中国本土开源数据库打造的面向ICT基础设施的自研数据库产品%';
二、全文检索
磐维1.0已支持文本搜索,也就是全文检索,全文检索功能使用两个数据新的类型tsvector和tsquery,并且通过动态检索自然语言文档的集合,定位到最匹配的查询结果。
数据库默认的分词器采用空格进行分词(default_text_search_config=pg_catalog.english),但是因为中文的词语之间没有空格分割,所以这种方法并不适用于中文。
磐维1.0支持中文的分词器有ngram,而磐维2.0新增了功能更强大的zhparser,可以使用元命令\dFp查看当前支持哪些分词器。
zhparser是基于Simple Chinese Word Segmentation(SCWS)中文分词库实现的一个扩展,在磐维2.0里可以直接使用。
zhparser分词器可以将中文切分成下面26种token
select ts_token_type('zhparser');
ts_token_type
---------------------------------
(97,a,"adjective,形容词")
(98,b,"differentiation,区别词")
(99,c,"conjunction,连词")
(100,d,"adverb,副词")
(101,e,"exclamation,感叹词")
(102,f,"position,方位词")
(103,g,"root,词根")
(104,h,"head,前连接成分")
(105,i,"idiom,成语")
(106,j,"abbreviation,简称")
(107,k,"tail,后连接成分")
(108,l,"tmp,习用语")
(109,m,"numeral,数词")
(110,n,"noun,名词")
(111,o,"onomatopoeia,拟声词")
(112,p,"prepositional,介词")
(113,q,"quantity,量词")
(114,r,"pronoun,代词")
(115,s,"space,处所词")
(116,t,"time,时语素")
(117,u,"auxiliary,助词")
(118,v,"verb,动词")
(119,w,"punctuation,标点符号")
(120,x,"unknown,未知词")
(121,y,"modal,语气词")
(122,z,"status,状态词")
(26 rows)
使用zhparser分词器需要做两步配置:
1)注册zhparser分词器
CREATE TEXT SEARCH CONFIGURATION chinese_zhparser (PARSER = zhparser);
2)配置相应的token映射
参考前面查询的token进行映射
ALTER TEXT SEARCH CONFIGURATION chinese_zhparser
ADD MAPPING FOR n,v,a,i,e,l WITH simple;
映射了名词(n),动词(v),形容词(a),成语(i),叹词(e)和习用语(l)6种。
接下来可以进行测试:
create table test(info text);
insert into test select '大连市星海广场' from generate_series(1,10000,1);
create index on test using gin (to_tsvector('chinese_zhparser'::regconfig,info));
explain analyze select count(*) from test where to_tsvector('chinese_zhparser', info) @@ '大连市 & 星海 & 广场'::tsquery;
还可以使用ts_debug函数来调试全文检索,显示文档每个词条通过基本词典的分析和处理的信息。
select ts_debug('chinese_zhparser','大连市星海广场');
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




