PostgreSQL chinese full text search 中文全文检索
首先要感谢amutu以及其他为中文检索贡献的兄弟们, 我在之前写过一些关于PG中文全文检索的文章, 比较繁琐.
http://blog.163.com/digoal@126/blog/static/163877040201252141010693/
使用amutu的zhparser就比较方便了, 分词的部署比以前简单很多. 具体可参看amutu 的BLOG,
http://amutu.com/blog/zhparser/
zhparserzhparser是什么
zhparser是一个PostgreSQL中文分词的插件,通过它,可以使PostgreSQL支持中文的全文检索(Full Text Search)。
为什么需要zhparser
一般英语等语言分词比较简单,按照标点、空格切分语句即可获得有含义的词语,PostgreSQL自带的parser就是按照这个原理来分词的,比较简单。而中文就比较复杂,词语之间没有空格分割,长度也不固定,怎么分词有时还跟语句的语义有关,因此PG自带的parser不能用来做中文分词。使用zhparser这个插件,便可以使PG支持中文分词,继而可以使用PG做中文全文检索。
zhparser原理是什么
zhparser用C语言实现了PostgreSQL TEXT SEARCH PARSER需要的接口,这些接口会调用SCWS中文分词引擎进行分词。
我这里在CentOS 6.x x64和PostgreSQL 9.3.3上面测试了一下, 非常好用.
# wget http://www.xunsearch.com/scws/down/scws-1.2.2.tar.bz2# tar -jxvf scws-1.2.2.tar.bz2# cd scws-1.2.2# ./configure --prefix=/opt/scws-1.2.2# make# make install
# git clone https://github.com/amutu/zhparser.git# cd zhparser/[root@db-172-16-3-150 zhparser]# export PATH=/home/pg93/pgsql/bin:$PATH[root@db-172-16-3-150 zhparser]# which pg_config/home/pg93/pgsql/bin/pg_config# SCWS_HOME=/opt/scws-1.2.2 make# make install[root@db-172-16-3-150 zhparser]# su - pg93pg93@db-172-16-3-150-> psqlpsql (9.3.3)Type "help" for help.
digoal=# create extension zhparser;CREATE EXTENSION
digoal=# 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)
digoal=# CREATE TEXT SEARCH CONFIGURATION testzhcfg (PARSER = zhparser);CREATE TEXT SEARCH CONFIGURATION
digoal=# select * from pg_ts_config where cfgname="testzhcfg"; cfgname | cfgnamespace | cfgowner | cfgparser -----------+--------------+----------+----------- testzhcfg | 25956 | 10 | 26134(1 row)配置token type, 参考http://www.postgresql.org/docs/9.3/static/textsearch-parsers.htmldigoal=# ALTER TEXT SEARCH CONFIGURATION testzhcfg ADD MAPPING FOR n,v,a,i,e,l WITH simple;ALTER TEXT SEARCH CONFIGURATIONdigoal=# 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年,保障房进入了更大规模的建设阶段。住房城乡建设部党组书记、部长姜伟新去年底在全国住房城乡建设工作会议上表示,要继续推进保障性安居工程建设。"); tokid | token -------+---------- 101 | hello 101 | world 117 | ! 101 | 2010 113 | 年 118 | 保障 110 | 房建 118 | 设在 110 | 全国 110 | 范围 102 | 内 118 | 获 97 | 全面 118 | 启动 117 | , 110 | 从中 118 | 央 118 | 到 110 | 地方 100 | 纷纷 118 | 加大 118 | 了 118 | 保 110 | 障 110 | 房 117 | 的 118 | 建 118 | 设 99 | 和 118 | 投 118 | 入 110 | 力 107 | 度 117 | 。 101 | 2011 113 | 年 117 | , 118 | 保障 110 | 房 118 | 进入 118 | 了 100 | 更 110 | 大规模 117 | 的 118 | 建设 110 | 阶段 117 | 。 110 | 住房 110 | 城乡建设 110 | 部党组 110 | 书记 117 | 、 110 | 部长 110 | 姜伟新 116 | 去年底 112 | 在 110 | 全国 110 | 住房 110 | 城乡建设 118 | 工作 110 | 会议 110 | 上表 118 | 示 117 | , 118 | 要 118 | 继续 118 | 推进 110 | 保障性 118 | 安居 110 | 工程建设 117 | 。(71 rows)
SELECT to_tsvector("testzhcfg","“今年保障房新开工数量虽然有所下调,但实际的年度在建规模以及竣工规模会超以往年份,相对应的对资金的需求也会创历史纪录。”陈国强说。在他看来,与2011年相比,2012年的保障房建设在资金配套上的压力将更为严峻。"); to_tsvector --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- "2011":27 "2012":29 "上":35 "下调":7 "严峻":37 "会":14 "会创":20 "保障":1,30 "历史":21 "压力":36 "国强":24 "在建":10 "实际":8 "对应":17 "年份":16 "年度":9 "开工":4 "房":2 "房建":31 "数量":5 "新":3 "有所":6 "相比":28 "看来":26 "竣工":12 "纪录":22 "规模":11,13 "设在":32 "说":25 "资金":18,33 "超":15 "配套":34 "陈":23 "需求":19(1 row)
SELECT to_tsquery("testzhcfg", "保障房资金压力"); to_tsquery --------------------------------- "保障" & "房" & "资金" & "压力"(1 row)
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。