zhparser 是 LightDB 的一个扩展,用于中文全文搜索(普通话)。
它基于 Simple Chinese Word Segmentation(SCWS)
实现了一个中文语言解析器。
这些选项用于控制字典加载行为和分词行为。这些选项都不是必需的,并且默认情况下为 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 选项需要在后端启动之前设置(可以在配置文件中更改,并重新加载,此后新的连接才会生效),其他选项可以在会话中随时设置以生效。
-- 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)
** 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词典是简体中文。
** 自定义字典 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 | 资金压力