1. 程式人生 > >PostgreSQL chinese full text search 中文全文檢索

PostgreSQL chinese full text search 中文全文檢索

首先要感謝amutu以及其他為中文檢索貢獻的兄弟們, 我在之前寫過一些關於PG中文全文檢索的文章, 比較繁瑣. 使用amutu的zhparser就比較方便了, 分詞的部署比以前簡單很多. 具體可參看amutu 的BLOG,  zhparserzhparser是什麼zhparser是一個PostgreSQL中文分詞的外掛,通過它,可以使PostgreSQL支援中文的全文檢索(FullTextSearch)。為什麼需要zhparser一般英語等語言分詞比較簡單,按照標點、空格切分語句即可獲得有含義的詞語,PostgreSQL自帶的parser就是按照這個原理來分詞的,比較簡單。而中文就比較複雜,詞語之間沒有空格分割,長度也不固定,怎麼分詞有時還跟語句的語義有關,因此PG自帶的parser不能用來做中文分詞。使用zhparser這個外掛,便可以使PG支援中文分詞,繼而可以使用PG做中文全文檢索。zhparser原理是什麼
zhparserC語言實現了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/[[email protected] zhparser]# export PATH=/home/pg93/pgsql/bin:$PATH[[email protected] zhparser]# which pg_config/home/pg93/pgsql/bin/pg_config# SCWS_HOME=/opt/scws-1.2.2 make# make install[[email protected] zhparser]# su - pg93[email protected]> psqlpsql (9.3.3)Type "help" for help.
digoal=# create extension zhparser;CREATE EXTENSIONdigoal=# 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 CONFIGURATIONdigoal=#           select * from pg_ts_config where cfgname='testzhcfg';  cfgname  | cfgnamespace | cfgowner | cfgparser -----------+--------------+----------+----------- testzhcfg |        25956 |       10 |     26134(1 row)digoal=# 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| hello101| world117|!101|2010113|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|2011113|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)