PostgreSQL chinese full text search 中文全文檢索
阿新 • • 發佈:2018-12-25
首先要感謝amutu以及其他為中文檢索貢獻的兄弟們, 我在之前寫過一些關於PG中文全文檢索的文章, 比較繁瑣.
使用amutu的zhparser就比較方便了, 分詞的部署比以前簡單很多. 具體可參看amutu 的BLOG,
zhparserzhparser是什麼zhparser是一個PostgreSQL中文分詞的外掛,通過它,可以使PostgreSQL支援中文的全文檢索(FullTextSearch)。為什麼需要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/[[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)