E.48. zhparser

E.48.1. 配置
E.48.2. 示例
E.48.3. 自定义字典
E.48.4. 自定义字典 2.1

zhparser 是 LightDB 的一个扩展,用于中文全文搜索(普通话)。 它基于 Simple Chinese Word Segmentation(SCWS) 实现了一个中文语言解析器。

E.48.1. 配置

这些选项用于控制字典加载行为和分词行为。这些选项都不是必需的,并且默认情况下为 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 的非停用词:有关更多信息,请参见 lightdb_tsearch_non_stopwords

除了 zhparser 随附的字典之外,您还可以添加自定义字典,它们优先于本地字典。文件必须存储在 share/postgresql/tsearch_data 目录中。zhparser 根据文件扩展名确定字典格式。.txt 扩展名表示字典采用文本格式,.xdb 扩展名表示字典采用 XDB 格式。多个文件使用逗号分隔,并且字典按优先级从高到低分类,例如:

zhparser.extra_dicts = 'dict_extra.txt,mydict.xdb'

注意:zhparser.extra_dicts 和 zhparser.dict_in_memory 选项需要在后端启动之前设置(可以在配置文件中更改,并重新加载,此后新的连接才会生效),其他选项可以在会话中随时设置以生效。

E.48.2. 示例

            -- make test configuration using parser

            CREATE TEXT SEARCH CONFIGURATION testzhcfg (PARSER = zhparser);

            -- add token mapping

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

            -- ts_parse

            SELECT * FROM ts_parse('zhparser', 'hello world! 2010年保障房建设在全国范围内获全面启动,从中央到地方纷纷加大 了保障房的建设和投入力度 。2011年,保障房进入了更大规模的建设阶段。住房城乡建设部党组书记、部长姜伟新去年底在全国住房城乡建设工作会议上表示,要继续推进保障性安居工程建设。');

            -- test to_tsvector

            SELECT to_tsvector('testzhcfg','“今年保障房新开工数量虽然有所下调,但实际的年度在建规模以及竣工规模会超以往年份,相对应的对资金的需求也会创历>史纪录。”陈国强说。在他看来,与2011年相比,2012年的保障房建设在资金配套上的压力将更为严峻。');

            -- test to_tsquery

            SELECT to_tsquery('testzhcfg', '保障房资金压力');
			
            -- test lightdb_tsearch_non_stopwords
            
            SET lightdb_tsearch_non_stopwords  = '1';
            ERROR:  invalid value for parameter "lightdb_tsearch_non_stopwords": "1"
            DETAIL:  lightdb_tsearch_non_stopwords not support '1' as non stopword.
            
            SET lightdb_tsearch_non_stopwords  = '=@:_-';
            SELECT to_tsvector('testzhcfg', '浙江省杭州市this is from lt_hs_tab table 滨江区江南大道logged at 2020-12-21 恒生电子 00:22:32, username=zjh&pwd=balabala');
                                                                                                            to_tsvector                                                                                                   
            ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
            '00:22:32':16 '2020-12-21':13 'at':12 'from':5 'is':4 'logged':11 'lt_hs_tab':6 'pwd=balabala':18 'table':7 'this':3 'username=zjh':17 '大道':10 '恒生':14 '杭州市':2 '江南':9 '浙江省':1 '滨江区':8 '电子':15
            (1 row)
            
            SET lightdb_tsearch_non_stopwords  = '';
            SELECT to_tsvector('testzhcfg', 'this is from lt_hs_tab table logged at 2020-12-21 00:22:32, username=zjh&pwd=balabala');
                                                                                    to_tsvector                                                                            
            ------------------------------------------------------------------------------------------------------------------------------------------------------------------
            '00':11 '12':9 '2020':8 '21':10 '22':12 '32':13 'at':7 'balabala':17 'from':3 'is':2 'logged':6 'lt_hs_tab':4 'pwd':16 'table':5 'this':1 'username':14 'zjh':15
            (1 row)
        

E.48.3. 自定义字典

** TXT 字典目前与 CLI/SCws_gen_dict 用于文本字典兼容 **

  • 每行一个词条,以 # 或分号开头的注释将被忽略和跳过。

    每行由 4 个字段组成,依次为“单词”(由汉字或少于 3 个字母组成)、“TF”、“IDF”和“词性”。字段由空格或制表符分隔。字段数量没有限制,并且可以对齐以美化自己。

    除了“单词”以外,其他字段都可以忽略。如果省略,则 TF 和 IDF 默认为 1.0,词性为“@”。

    TXT库的动态加载(内部监视文件修改时间自动转换为XDB存储在系统临时目录中),建议TXT字典不要太大。

    要删除单词,请将其词性设置为“! ”,这样单词就被设置为无效,即使它存在于其他核心库中。

注意: 1. 自定义字典的格式可以是TXT或二进制XDB格式。 XDB格式更高效,适用于大型字典。您可以使用内置的SCWS工具scWS-Gen-dict将文本词典转换为XDB格式。 2. 默认的zhparser词典是简体中文。

E.48.4. 自定义字典 2.1

** 自定义字典 2.1 增加了自定义字典的可移植性,并与 1.0 提供的功能兼容 **

自定义字典需要超级用户权限。自定义字典是数据库级别的(而非实例级别的)。每个数据库都有自己的自定义分词,并存储在数据目录 base/ 数据库ID 下(版本 2.0 存储在 share/tsearch_data 下)。

            test=# SELECT * FROM ts_parse('zhparser', '保障房资金压力');
             tokid | token
            -------+-------
               118 | 保障
               110 | 房
               110 | 资金
               110 | 压力

            test=# insert into zhparser.zhprs_custom_word values('资金压力');
            --Delete the word insert into zhprs_custom_word(word, attr) values('word', '!');
            --\d zhprs_custom_word view its table structure, supported TD, IDF
            test=# select sync_zhprs_custom_word();
             sync_zhprs_custom_word
            ------------------------

            (1 row)

            test=# \q --sync then re-establish the connection
            [lzzhang@lzzhang-pc bin]$ ./psql -U lzzhang -d test -p 1600
            test=# SELECT * FROM ts_parse('zhparser', '保障房资金压力');
             tokid |  token
            -------+----------
               118 | 保障
               110 | 房
               120 | 资金压力