Skip to content

Latest commit

 

History

History
143 lines (104 loc) · 5.32 KB

20160310_01.md

File metadata and controls

143 lines (104 loc) · 5.32 KB

使用阿里云PostgreSQL zhparser中文分词时不可不知的几个参数

作者

digoal

日期

2016-03-10

标签

PostgreSQL , 有且只有一条记录


背景

阿里云RDS PgSQL已支持zhparser中文分词插件,用法举例:

create extension zhparser;  
  
select * from pg_ts_parser ;  
 prsname  | prsnamespace |  prsstart   |    prstoken     |  prsend   |  prsheadline  |  prslextype     
----------+--------------+-------------+-----------------+-----------+---------------+---------------  
 default  |           11 | prsd_start  | prsd_nexttoken  | prsd_end  | prsd_headline | prsd_lextype  
 zhparser |        25956 | zhprs_start | zhprs_getlexeme | zhprs_end | prsd_headline | zhprs_lextype  
(2 rows)  
  
CREATE TEXT SEARCH CONFIGURATION testzhcfg (PARSER = zhparser);  
  
digoal=#           select * from pg_ts_config where cfgname='testzhcfg';  
  cfgname  | cfgnamespace | cfgowner | cfgparser   
-----------+--------------+----------+-----------  
 testzhcfg |        25956 |       10 |     26134  
(1 row)  
  
ALTER TEXT SEARCH CONFIGURATION testzhcfg ADD MAPPING FOR n,v,a,i,e,l WITH simple;  

digoal=#           select * from pg_ts_config_map where mapcfg=(select oid from pg_ts_config where cfgname='testzhcfg');  
 mapcfg | maptokentype | mapseqno | mapdict   
--------+--------------+----------+---------  
  26135 |           97 |        1 |    3765  
  26135 |          101 |        1 |    3765  
  26135 |          105 |        1 |    3765  
  26135 |          108 |        1 |    3765  
  26135 |          110 |        1 |    3765  
  26135 |          118 |        1 |    3765  
(6 rows)  
  
SELECT * FROM ts_parse('zhparser', 'hello world! 2010年保障房建设在全国范围内获全面启动,从中央到地方纷纷加大 了 保 障 房 的 建 设   
和 投 入 力 度 。2011年,保障房进入了更大规模的建设阶段。住房城乡建设部党组书记、部长姜伟新去年底在全国住房城乡建设工作会议上表示,  
要继续推进保障性安居工程建设。');  
  
SELECT to_tsvector('testzhcfg','“今年保障房新开工数量虽然有所下调,但实际的年度在建规模以及竣工规模会超以往年份,相对应的对资金的需  
求也会创历史纪录。”陈国强说。在他看来,与2011年相比,2012年的保障房建设在资金配套上的压力将更为严峻。');  
  
SELECT to_tsquery('testzhcfg', '保障房资金压力');  
           to_tsquery              
---------------------------------  
 '保障' & '房' & '资金' & '压力'  
(1 row)  

zhparser还有一些特殊的配置项,以下配置在PG9.2及以上版本使用,这些选项是用来控制字典加载行为和分词行为的,这些选项都不是必须的,默认都为false(即如果没有在配置文件中设置这些选项,则zhparser的行为与将下面的选项设置为false一致)。

zhparser.punctuation_ignore = f  
  
zhparser.seg_with_duality = f  
  
zhparser.dict_in_memory = f  
  
zhparser.multi_short = f  
  
zhparser.multi_duality = f  
  
zhparser.multi_zmain = f  
  
zhparser.multi_zall = f  

对应的scws介绍

http://www.xunsearch.com/scws/docs.php#libscws

8. `void scws_set_ignore(scws_t s, int yes)` 设定分词结果是否忽略所有的标点等特殊符号(不会忽略\r和\n)。  
  
   > **参数 yes** 1 表示忽略,0 表示不忽略,缺省情况为不忽略。  
  
9. `void scws_set_multi(scws_t s, int mode)` 设定分词执行时是否执行针对长词复合切分。(例:“中国人”分为“中国”、“人”、“中国人”)。  
  
   > **参数 mode** 复合分词法的级别,缺省不复合分词。取值由下面几个常量异或组合:  
   >  
   >   - SCWS_MULTI_SHORT   短词  
   >   - SCWS_MULTI_DUALITY 二元(将相邻的2个单字组合成一个词)  
   >   - SCWS_MULTI_ZMAIN   重要单字  
   >   - SCWS_MULTI_ZALL    全部单字  
  
10. `void scws_set_duality(scws_t s, int yes)` 设定是否将闲散文字自动以二字分词法聚合。  
  
   > **参数 yes** 如果为 1 表示执行二分聚合,0 表示不处理,缺省为 0。    

测试multi_short如下

digoal=> select to_tsvector('zhcfg','云安全部');  
 to_tsvector   
-------------  
 '云安':1  
(1 row)  
  
digoal=> select to_tsvector('zhcfg','云 安全部');  
        to_tsvector           
----------------------------  
 '云':1 '安全':3 '安全部':2  
(1 row)  
  
digoal=> set zhparser.multi_short=off;  
SET  
digoal=> select to_tsvector('zhcfg','网络安全部');  
     to_tsvector       
---------------------  
 '安全部':2 '网络':1  
(1 row)  
  
digoal=> set zhparser.multi_short=on;  
SET  
digoal=> select to_tsvector('zhcfg','网络安全部');  
         to_tsvector            
------------------------------  
 '安全':3 '安全部':2 '网络':1  
(1 row)  

影响索引zhparser的设置影响to_tsvector函数索引。

建议初始 zhparser.multi_short=on 设置为on。

或者设置用户级别或者数据库级别的参数,例如。

alter role all set zhparser.multi_short=on;