瀚高数据库
目录
环境
文档用途
详细信息

环境
系统平台:N/A
版本:14
文档用途
本文参考《zhparser全文检索》,文章ID:051686104;对其进行互补,对zhparser进行进一步的了解。

详细信息
1、介绍

Zhparser是一个PostgreSQL扩展,用于中文全文搜索。它实现了一个基于简单中文分词(SCWS)的中文解析器。

SCWS 是 Simple Chinese Word Segmentation 的首字母缩写(即:简易中文分词系统)。这是一套基于词频词典的机械式中文分词引擎,它能将一整段的中文文本基本正确地切分成词。词是 中文的最小语素单位,但在书写时并不像英语会在词之间用空格分开,所以如何准确并快速分词一直是中文分词的攻关难点。

PHP 分词演示地址如下:

GBK http://www.xunsearch.com/scws/demo/v4.php

UTF-8 http://www.xunsearch.com/scws/demo/v48.php

繁体中文 http://www.xunsearch.com/scws/demo/v48.cht.php

整个全文搜索功能都是在PostgreSQL内置的全文搜索功能基础上实现的,Zhparser在很大程度上实现了对中文文本的解析。

2、安装

安装过程请参考《文章ID:051686104》,可能遇到的安装问题如下:

1)建议从官网下载scws源码,如果是从github上下载的scws源码需要先运行以下命令生成configure文件:

aclocal; autoconf; autoheader; libtoolize; automake --add-missing

2)已安装多个PG版本问题,报错如下:

[40861] ERROR:  incompatible library "/opt/postgresql-14/lib/zhparser.so": version mismatch
[ 40861] DETAIL:  Server is version 14, library is version 12.

[40861] STATEMENT:  create extension zhparser ;

ERROR:  incompatible library "/opt/postgresql-14/lib/zhparser.so": version mismatch

DETAIL:  Server is version 14, library is version 12.

解决:

export SCWS_HOME=/opt/scws-1.2.3

make PG_CONFIG=/opt/postgresql-14/bin/pg_config

make instal

3、配置

1)创建使用zhparser作为解析器的全文搜索的配置

   create text search configuration zh_cn (PARSER = zhparser);

2)解析器配置

zhparser.multi_short = f    短词复合

zhparser.multi_duality = f  散字二元复合

zhparser.multi_zmain = f    重要单字复合

zhparser.multi_zall = f     全部单字复合

zhparser.punctuation_ignore = f   忽略所有的标点等特殊符号

zhparser.seg_with_duality = f   闲散文字自动以二字分词法聚合

zhparser.dict_in_memory = f         将词典全部加载到内存里

zhparser.extra_dicts = ‘dict_extra.txt,mydict.xdb’   用户自定义词典

此处先不配置采用默认的,后面根据业务场景的使用再进行特殊配置;默认全部off。

4、词性配置

zhparser目前支持26种词性配置,即26个英文字母代表的词性;其词性标注来自北大词性标注版本。

1)将词性添加到词典使其支持此类词性

postgres=# alter text search configuration zh_cn add mapping

for a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z

with simple;

注:①词性配置带有唯一约束;

②这里的simple是PostgreSQL自带的词典模板,包含:Simple Dictionary、Synonym Dictionary、Thesaurus Dictionary、Ispell Dictionary、Snowball Dictionary等;词典的目的是为了忽略文本中重复出现次数多而又没啥具体意义的词,比如:的、了等;这些词在本模块称为“Stop Words”,可以称为可忽略词。

2)相关配置在数据库的体现,如下:

① 已存在的解析器

zhparser=# \dFp

            List of text search parsers

 Schema  |  Name  |  Description

-----------+----------+---------------------

pg_catalog | default  | default word parser

public   | zhparser |

② 默认的词典

zhparser=# \dFt 

                    List of text search templates

   Schema   |   Name    |        Description

------------+-----------+-----------------------------------------------------------

 pg_catalog | ispell    | ispell dictionary

 pg_catalog | simple    | simple dictionary: just lower case and check for stopword

 pg_catalog | snowball  | snowball stemmer

 pg_catalog | synonym   | synonym dictionary: replace word by its synonym

 pg_catalog | thesaurus | thesaurus dictionary: phrase by phrase substitution

③ 默认的对应每一种语言的语义词干,共29种

zhparser=# \dFd  

                             List of text search dictionaries

   Schema   |      Name       |                        Description

------------+-----------------+-----------------------------------------------------------

 pg_catalog | arabic_stem     | snowball stemmer for arabic language

 pg_catalog | armenian_stem   | snowball stemmer for armenian language

 pg_catalog | basque_stem     | snowball stemmer for basque language

 pg_catalog | catalan_stem    | snowball stemmer for catalan language

 pg_catalog | danish_stem     | snowball stemmer for danish language

 pg_catalog | dutch_stem      | snowball stemmer for dutch language

 pg_catalog | english_stem    | snowball stemmer for english language

 pg_catalog | finnish_stem    | snowball stemmer for finnish language

④各种语言的搜索配置,共29种

zhparser=# \dF 

               List of text search configurations

   Schema   |    Name    |              Description

------------+------------+---------------------------------------

 pg_catalog | arabic     | configuration for arabic language

 pg_catalog | armenian   | configuration for armenian language

 pg_catalog | basque     | configuration for basque language

 pg_catalog | catalan    | configuration for catalan language

 pg_catalog | danish     | configuration for danish language

 pg_catalog | dutch      | configuration for dutch language

 pg_catalog | simple     | simple configuration

 pg_catalog | tamil      | configuration for tamil language

 pg_catalog | turkish    | configuration for turkish language

 pg_catalog | yiddish    | configuration for yiddish language

 public     | zh_cn      |

⑤ 针对各种语言搜索配置的语义词干词性,太多了,只展示我们自己配置的

zhparser=# \dF+  

Text search configuration "public.zh_cn"

Parser: "public.zhparser"

 Token | Dictionaries

-------+--------------

 a     | simple

 b     | simple

 c     | simple

 d     | simple

 e     | simple

 f     | simple

 g     | simple

 h     | simple

 i     | simple

 j     | simple

 k     | simple

 l     | simple

 m     | simple

 n     | simple

 o     | simple

 p     | simple

 q     | simple

 r     | simple

 s     | simple

 t     | simple

 u     | simple

 v     | simple

 w     | simple

 x     | simple

 y     | simple

 z     | simple

5、测试

create table test_zhparser(pn_name varchar(1000));

insert into test_zhparser values ('三次学习会议精神');

create index idx_pname on test_zhparser using gin(to_tsvector('zh_cn', pn_name));



zhparser=# select  pn_name from test_zhparser

where to_tsvector('zh_cn', pn_name) @@ plainto_tsquery('zh_cn', '导向基础研究');

         pn_name

------------------------------------

 有组织推进战略导向的体系化基础研究

 前沿导向的探索性基础研究

 市场导向的应用性基础研究

6、解析函数

6.1 to_tsvector([config regconfig,]document text)

①用于将文本(查询字段)转换为tsvector数据类型;

②将文本文档解析为标记,将标记减少为单词,并返回一个tsvector,列出单词及其在文档中的位置。文档将根据指定的或默认的文本搜索配置进行处理。

如下例子:

zhparser=# SELECT to_tsvector('english', 'a fat  cat sat on a mat - it ate a fat rats');

                     to_tsvector

-----------------------------------------------------

 'ate':9 'cat':3 'fat':2,11 'mat':7 'rat':12 'sat':4



zhparser=# SELECT to_tsvector('zh_cn', 'a fat  cat sat on a mat - it ate a fat rats');

                                     to_tsvector

--------------------------------------------------------------------------------------

 '-':8 'a':1,6,11 'ate':10 'cat':3 'fat':2,12 'it':9 'mat':7 'on':5 'rats':13 'sat':4



zhparser=# SELECT to_tsvector('english', '有组织推进战略导向的体系化基础研究');

              to_tsvector

----------------------------------------

 '有组织推进战略导向的体系化基础研究':1



zhparser=# SELECT to_tsvector('zh_cn', '有组织推进战略导向的体系化基础研究');

                                       to_tsvector

------------------------------------------------------------------------------------------

 '体系':8 '体系化':7 '基础':9 '导向':5 '战略':4 '推进':3 '有':1 '的':6 '研究':10 '组织':2

以上示例中,生成的tsvector不包含单词a、on或it,单词rats变为rat,标点符号-被忽略,这些词在官方称为“Stop Words”,就是可忽略词;a、on、it已被忽略,的却没有被忽略,这是词典配置策略问题;请参考最后的《Stop Words》章节。

6.2 将查询条件转换为tsquery数据类型的to_tsquery、plasto_tsquery、phraseto_tsquery和websearch_to_tsquery函数

①to_tsquery([config regconfig,]querytext文本)

 从querytext创建一个tsquery值,该值必须由tsquery运算符&(AND)、|(OR)、!分隔的单个标记组成!(NOT)和<->(FOLLOWED BY),可以使用括号分组;换句话说,to_tsquery的输入必须遵循tsquery输入的一般规则。

②plainto_tsquery([ config regconfig, ] querytext text)

 将未格式化的文本querytext转换为tsquery值,文本与to_tsvector一样被解析和规范化,然后将&(and)运算符插入保留单词之间。

③phraseto_tsquery([config regconfig,]querytext文本)

 类似plainto_tsquery ,只是它在保留单词之间插入<->(FOLLOWED BY)运算符,而不是&(AND)运算符;此外,可忽略词不是简单地丢弃,而是通过插入<N>运算符而不是<->运算符来解析。

④websearch_to_tsquery([config regconfig,]querytext text)

 使用另一种语法从querytext创建tsquery值,其中简单的无格式文本是有效的;与plainto_tsquery和phraseto_tsquery不同,它还识别某些运算符。

例子如下:

zhparser=# select to_tsquery('zh_cn', '有组织推进战略导向的体系化基础研究');

                               to_tsquery                       

---------------------------------------------------------------------------------------------------------

'有' <-> '组织' <-> '推进' <-> '战略' <-> '导向' <-> '的' <-> '体系化' <-> '体系' <-> '基础' <-> '研究'



zhparser=# select plainto_tsquery('zh_cn', '有组织推进战略导向的体系化基础研究');

                               plainto_tsquery                       

---------------------------------------------------------------------------------------

'有' & '组织' & '推进' & '战略' & '导向' & '的' & '体系化' & '体系' & '基础' & '研究‘



zhparser=# select phraseto_tsquery('zh_cn', '有组织推进战略导向的体系化基础研究');

                               phraseto_tsquery                     

---------------------------------------------------------------------------------------------------------

'有' <-> '组织' <-> '推进' <-> '战略' <-> '导向' <-> '的' <-> '体系化' <-> '体系' <-> '基础' <-> '研究'



zhparser=# select websearch_to_tsquery('zh_cn', '有组织推进战略导向的体系化基础研究');

                               websearch_to_tsquery             

---------------------------------------------------------------------------------------------------------

'有' <-> '组织' <-> '推进' <-> '战略' <-> '导向' <-> '的' <-> '体系化' <-> '体系' <-> '基础' <-> '研究‘

7、高亮显示

zhparser=# select ts_headline('zh_cn',pn_name,plainto_tsquery('zh_cn', '导向性基础研究')) 

       from test_zhparser where to_tsvector('zh_cn', pn_name) @@ plainto_tsquery('zh_cn', ' 导向基础研究');

                   ts_headline

-------------------------------------------------------------

有组织推进战略<b>导向</b>的体系化体系<b>基础</b><b>研究</b>

前沿<b>导向</b>的探索性探索<b>基础</b><b>研究</b>

市场<b>导向</b>的应用性应用<b>基础</b><b>研究</b>
zhparser=# select ts_headline(  'zh_cn', 

                      pn_name, 

                      plainto_tsquery('zh_cn', '导向性基础研究'), 

                      'StartSel=''<font color="red">'', 

                      StopSel=</font>' ) 

       from test_zhparser 

       where to_tsvector('zh_cn', pn_name) @@ plainto_tsquery('zh_cn', ' 导向基础研究');

                              ts_headline

-------------------------------------------------------------------------------------------------------------------

有组织推进战略导向的体系化体系基础研究

前沿导向的探索性探索基础研究

市场导向的应用性应用基础研究

ts_headline([ config regconfig, ] document text, query tsquery [, options text ]) returns text
options支持以下选项:

MaxWords,MinWords(整数):这些数字决定要输出的最长和最短标题;默认值为35和15。

ShortWord(整数):此长度或以下的单词将在标题的开头和结尾处删除,除非它们是查询词,默认值为3。

HighlightAll(布尔值):如果为true,则整个文档将用作标题,忽略前面的三个参数;默认值为false。

MaxFragments(整数):要显示的最大文本片段数;默认值为零。

StartSel、StopSel(字符串):用于分隔文档中出现的查询词的字符串,以将其与其他摘录词区分开来;默认值为“”和“”,可适用于HTML输出。

FragmentDelimiter(字符串):当显示多个片段时,这些片段将由该字符串分隔;默认值为“…”。

如上查询结果在HTML显示如下:
image.png

8、排序

根据文档与查询条件的相关性,对查询结果进行排序,优先显示最相关的结果。提供了两个排序函数ts_rank和ts_rank_cd,相关性包含了频次、词位、接近度、结构信息等维度。其实相关性的概念是非常模糊的,而且与实际的业务场景是紧密相关的。这两个内置函数只是例子,我们可以编写自己的排序函数或者与其他相关因素叠加,来实现匹配自己业务场景的需求。

频次:搜索条件出现的次数

词位:搜索条件在文本中出现的位置,从头开始算,可忽略词不计算位置

接近度:搜索条件和文本位置的接近程度

结构信息:搜索条件在文本中的重要程度

通过以下例子可以展示相关性的几个维度标准,如下:

#zhparser.multi_short=‘on’
#zhparser.multi_duality=‘on’
#zhparser.multi_zmain=‘on’
#zhparser.multi_zall=‘on’

zhparser.multi_short=‘on’
zhparser.multi_duality=‘on’
zhparser.multi_zmain=‘on’
zhparser.multi_zall=‘on’
ts_rank_cd(to_tsvector(‘zh_cn’, c1), to_tsquery(‘zh_cn’, ‘长江’))
长江频雨后,明月众星中
长江险可逾,蜀道难可陟
长江为杯斗为构,一饮天地生春红
且归来,谈笑护长江,波澄碧
昔人不可见,长江无尽时
我住长江头,君住长江尾
哀吾生之须臾,羡长江之无穷

ts_rank_cd(to_tsvector(‘zh_cn’, c1), to_tsquery(‘zh_cn’, ‘长江’))
长江频雨后,明月众星中
长江险可逾,蜀道难可陟
长江为杯斗为构,一饮天地生春红
且归来,谈笑护长江,波澄碧
昔人不可见,长江无尽时
我住长江头,君住长江尾
哀吾生之须臾,羡长江之无穷

ts_rank_cd(to_tsvector(‘zh_cn’, c1), to_tsquery(‘zh_cn’, ‘长江’),2)
长江频雨后,明月众星中
昔人不可见,长江无尽时
我住长江头,君住长江尾
且归来,谈笑护长江,波澄碧
长江险可逾,蜀道难可陟
哀吾生之须臾,羡长江之无穷
长江为杯斗为构,一饮天地生春红

ts_rank_cd(to_tsvector(‘zh_cn’, c1), to_tsquery(‘zh_cn’, ‘长江’),2)
长江险可逾,蜀道难可陟
长江频雨后,明月众星中
昔人不可见,长江无尽时
我住长江头,君住长江尾
哀吾生之须臾,羡长江之无穷
且归来,谈笑护长江,波澄碧
长江为杯斗为构,一饮天地生春红

ts_rank_cd(to_tsvector(‘zh_cn’, c1), to_tsquery(‘zh_cn’, ‘长江’),0|1|2|4)
长江频雨后,明月众星中
昔人不可见,长江无尽时
我住长江头,君住长江尾
且归来,谈笑护长江,波澄碧
长江险可逾,蜀道难可陟
哀吾生之须臾,羡长江之无穷
长江为杯斗为构,一饮天地生春红

ts_rank_cd(to_tsvector(‘zh_cn’, c1), to_tsquery(‘zh_cn’, ‘长江’),0|1|2|4)
长江险可逾,蜀道难可陟
长江频雨后,明月众星中
昔人不可见,长江无尽时
我住长江头,君住长江尾
哀吾生之须臾,羡长江之无穷
且归来,谈笑护长江,波澄碧
长江为杯斗为构,一饮天地生春红

ts_rank(to_tsvector(‘zh_cn’, c1), to_tsquery(‘zh_cn’, ‘长江’))
长江频雨后,明月众星中
长江险可逾,蜀道难可陟
长江为杯斗为构,一饮天地生春红
且归来,谈笑护长江,波澄碧
昔人不可见,长江无尽时
我住长江头,君住长江尾
哀吾生之须臾,羡长江之无穷

ts_rank(to_tsvector(‘zh_cn’, c1), to_tsquery(‘zh_cn’, ‘长江’))
我住长江头,君住长江尾
长江险可逾,蜀道难可陟
长江为杯斗为构,一饮天地生春红
长江频雨后,明月众星中
昔人不可见,长江无尽时
哀吾生之须臾,羡长江之无穷
且归来,谈笑护长江,波澄碧

ts_rank(to_tsvector(‘zh_cn’, c1), to_tsquery(‘zh_cn’, ‘长江’),2)
长江频雨后,明月众星中
昔人不可见,长江无尽时
我住长江头,君住长江尾
且归来,谈笑护长江,波澄碧
长江险可逾,蜀道难可陟
哀吾生之须臾,羡长江之无穷
长江为杯斗为构,一饮天地生春红

ts_rank(to_tsvector(‘zh_cn’, c1), to_tsquery(‘zh_cn’, ‘长江’),2)
我住长江头,君住长江尾
长江险可逾,蜀道难可陟
长江频雨后,明月众星中
昔人不可见,长江无尽时
哀吾生之须臾,羡长江之无穷
且归来,谈笑护长江,波澄碧
长江为杯斗为构,一饮天地生春红

ts_rank(to_tsvector(‘zh_cn’, c1), to_tsquery(‘zh_cn’, ‘长江’),0|1|2|4)
长江频雨后,明月众星中
昔人不可见,长江无尽时
我住长江头,君住长江尾
且归来,谈笑护长江,波澄碧
长江险可逾,蜀道难可陟
哀吾生之须臾,羡长江之无穷
长江为杯斗为构,一饮天地生春红

ts_rank(to_tsvector(‘zh_cn’, c1), to_tsquery(‘zh_cn’, ‘长江’),0|1|2|4)
我住长江头,君住长江尾
长江险可逾,蜀道难可陟
长江频雨后,明月众星中
昔人不可见,长江无尽时
哀吾生之须臾,羡长江之无穷
且归来,谈笑护长江,波澄碧
长江为杯斗为构,一饮天地生春红

9、自定义词库

两种方式:

1)解析器配置:zhparser.extra_dicts = ‘dict_extra.txt,mydict.xdb’;

2)zhparser自带的表zhprs_custom_word,插入自定义词语,同步后,重新创建连接即可生效;

建议使用第二种,作为普通表维护,简单高效,如下:

zhparser=# SELECT * FROM ts_parse('zhparser', '支付宝使用很方便');

 tokid | token

-------+-------

   118 | 支付

   110 |118 | 使用

   100 |118 | 方便

zhparser=# insert into zhparser.zhprs_custom_word values('支付宝');

zhparser=#  select sync_zhprs_custom_word();

zhparser=# \q

[pg14@localhost data]$ psql zhparser pg14

zhparser=# SELECT * FROM ts_parse('zhparser', '支付宝使用很方便');

 tokid | token

-------+--------

   120 | 支付宝

   118 | 使用

   100 |118 | 方便

zhparser=# SELECT * FROM ts_parse('zhparser', '请支付宝贝订单');

 tokid | token 

-------+-------

   118 |118 | 支付

   110 | 宝贝

   110 | 订单

--自定义词库虽然添加了“支付宝”,但是此处还是将“支付”、“宝贝”分开了,体现了zhparser的作用。



zhparser=# select * from  zhparser.zhprs_custom_word;

   word | tf  | idf | attr

----------+------+-----+------

 资金压力|  1 |  1 | @

 支付宝  |  1 |  1 | @

-- 此处将“@”改为“!”也可以使其不起作用,也可以where条件删除



zhparser=# delete from zhparser.zhprs_custom_word;

zhparser=#  select sync_zhprs_custom_word();

zhparser=# \q



[pg14@localhost data]$ psql zhparser pg14

zhparser=# SELECT * FROM ts_parse('zhparser', '我不喜欢支付宝支付');

 tokid | token

-------+-------

   114 |100 |118 | 喜欢

   118 | 支付

   110 |118 | 支付

10、分词粒度

解析器配置:

zhparser.multi_short = f 短词复合

zhparser.multi_duality = f 散字二元复合

zhparser.multi_zmain = f 重要单字复合

zhparser.multi_zall = f 全部单字复合

zhparser.punctuation_ignore = f 忽略所有的标点等特殊符号

zhparser.seg_with_duality = f 闲散文字自动以二字分词法聚合

默认值全部为off,效果如下:

zhparser=# select to_tsvector('zh_cn', '前沿导向的探索性基础研究');

               to_tsvector

-------------------------------------------------------

 '前沿':1 '基础':5 '导向':2 '探索性':4 '的':3 '研究':6

进行如下设置:

zhparser.multi_short='on'

zhparser.multi_duality='on'

zhparser.multi_zmain='on'

zhparser.multi_zall='on'

再次执行,解析结果如下:

zhparser=# select to_tsvector('zh_cn', '前沿导向的探索性基础研究');

                               to_tsvector

-----------------------------------------------------------------------------------------------------

 '前':2 '前沿':1 '向':6 '基':15 '基础':14 '导':5 '导向':4 '性':13 '探':11 '探索':9 '探索性':8 '沿':3 '的':7 '研':18 '研究':17 '础':16 '究':19 '索':12 '索性':10

由此可见,解析粒度更细了,但是这并不一定业务需要;粒度越细意味着耗时越长;需要根据业务具体调节。

11、Stop Words

Stop Words 是非常常见的词,几乎出现在每个文档中,没有实际价值。因此,在全文搜索的上下文中可以忽略它们。例如,每个英文文本都包含像a和the这样的单词,因此将它们存储在索引中是无用的。

使用PostgreSQL默认配置效果如下:

zhparser=# SELECT to_tsvector('english', 'a fat  cat sat on a mat - it ate a fat rats');

                 to_tsvector

-----------------------------------------------------

 'ate':9 'cat':3 'fat':2,11 'mat':7 'rat':12 'sat':4



zhparser=# SELECT to_tsvector('zh_cn', '有组织推进战略导向的体系化基础研究');

                      to_tsvector

------------------------------------------------------------------------------------------

 '体系':8 '体系化':7 '基础':9 '导向':5 '战略':4 '推进':3 '有':1 '的':6 '研究':10 '组织':2

这里english使用了默认配置的词典库,词典库中包含a、on、it这些词;下面我们通过配置词典来实现自动忽略“的”的效果。

Stop Words 词典存放在$SHAREDIR/tsearch_data目录下,如下:

[pg14@localhost tsearch_data]$ pwd

/opt/postgresql-14/share/tsearch_data

[pg14@localhost tsearch_data]$ ll

-rw-r--r--. pg14 pg14        4  chinese.stop --自己添加的,默认不带

-rw-r--r--. pg14 pg14      424  danish.stop

-rw-r--r--. pg14 pg14 14315393    dict.utf8.xdb

-rw-r--r--. pg14 pg14      453  dutch.stop

-rw-r--r--. pg14 pg14      622  english.stop

-rw-r--r--. pg14 pg14     1579  finnish.stop

-rw-r--r--. pg14 pg14      805  french.stop

-rw-r--r--. pg14 pg14     1349  german.stop

-rw-r--r--. pg14 pg14     1227  hungarian.stop

-rw-r--r--. pg14 pg14      243  hunspell_sample.affix

-rw-r--r--. pg14 pg14      633  hunspell_sample_long.affix

-rw-r--r--. pg14 pg14       98  hunspell_sample_long.dict

-rw-r--r--. pg14 pg14      462  hunspell_sample_num.affix

-rw-r--r--. pg14 pg14      129  hunspell_sample_num.dict

-rw-r--r--. pg14 pg14      465  ispell_sample.affix

-rw-r--r--. pg14 pg14       81  ispell_sample.dict

-rw-r--r--. pg14 pg14     1654  italian.stop

-rw-r--r--. pg14 pg14       24  mydict.xdb

-rw-r--r--. pg14 pg14     4261  nepali.stop

-rw-r--r--. pg14 pg14      851  norwegian.stop

-rw-r--r--. pg14 pg14     1267  portuguese.stop

-rw-r--r--. pg14 pg14     4396  rules.utf8.ini

-rw-r--r--. pg14 pg14     1235  russian.stop

-rw-r--r--. pg14 pg14     2178  spanish.stop

-rw-r--r--. pg14 pg14      559  swedish.stop

-rw-r--r--. pg14 pg14       73  synonym_sample.syn

-rw-r--r--. pg14 pg14      473  thesaurus_sample.ths

-rw-r--r--. pg14 pg14      260  turkish.stop



[pg14@localhost tsearch_data]$ more english.stop

i

me

my

myself

we

our

ours

ourselves

you

your

yours

yourself

yourselves

he

him

his

himself

she

her

hers

herself

--127条记录

进行以下配置:

zhparser=# alter text search configuration zh_cn drop mapping

for a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z ;



touch /opt/postgresql-14/share/tsearch_data/chinese.stop

chown pg14:pg14 -R pg14

vi 添加 “的”



zhparser=# CREATE TEXT SEARCH DICTIONARY chinese_dict (

      TEMPLATE = pg_catalog.simple,

  STOPWORDS = chinese

           );

    

zhparser=# alter text search configuration zh_cn add mapping

for a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z with chinese_dict;



重启数据库

再次测试效果:

zhparser=# SELECT to_tsvector('zh_cn', '有组织推进战略导向的体系化基础研究');

                           to_tsvector

-----------------------------------------------------------------------------------

 '体系':8 '体系化':7 '基础':9 '导向':5 '战略':4 '推进':3 '有':1 '研究':10 '组织':2

查看效果“的”已经忽略了。

05-15 16:21