使用PostgreSQL數(shù)據(jù)庫進行中文全文搜索的實現(xiàn)方法
如何使用zhparser
安裝相應插件
1 安裝 pg_trgm
用于執(zhí)行文本相似性和模糊搜索。它基于 trigram 算法,允許你在文本數(shù)據(jù)上執(zhí)行模糊匹配、相似性搜索和索引。命令如下
CREATE EXTENSION pg_trgm
2 安裝 zhparser
專門用于處理中文文本數(shù)據(jù)。它允許 PostgreSQL 在中文文本上執(zhí)行全文搜索,包括分詞、詞干提取、停用詞處理等操作,以便提高中文文本數(shù)據(jù)的搜索準確性和性能。命令如下
CREATE EXTENSION zhparser
創(chuàng)建基于zhparser的搜索配置
CREATE TEXT SEARCH CONFIGURATION chinese_zh (PARSER = zhparser)
這個命令創(chuàng)建了一個名為 chinese_zh
的中文文本搜索配置。該配置使用了 zhparser
解析器,表明它將用于分析和處理中文文本數(shù)據(jù)。
ALTER TEXT SEARCH CONFIGURATION chinese_zh ADD MAPPING FOR n,v,a,i,e,l WITH simple
這個命令將指定的詞匯類別(n,v,a,i,e,l)與已存在的 simple
配置進行映射。這意味著對于這些詞匯類別,將使用 simple
配置的規(guī)則來進行文本分析和處理。
進行搜索查詢
select ts_debug('chinese_zh', '春秋、戰(zhàn)國是中國歷史上思想迸發(fā)的時代,出現(xiàn)了百家爭鳴的現(xiàn)象');
執(zhí)行結果:
"(t,""time,時語素"",春秋,{},,)" "(u,""auxiliary,助詞"",、,{},,)" "(t,""time,時語素"",戰(zhàn)國,{},,)" "(v,""verb,動詞"",是,{simple},simple,{是})" "(n,""noun,名詞"",中國,{simple},simple,{中國})" "(n,""noun,名詞"",歷史,{simple},simple,{歷史})" "(n,""noun,名詞"",上思,{simple},simple,{上思})" "(v,""verb,動詞"",想,{simple},simple,{想})" "(v,""verb,動詞"",迸發(fā),{simple},simple,{迸發(fā)})" "(u,""auxiliary,助詞"",的,{},,)" "(n,""noun,名詞"",時代,{simple},simple,{時代})" "(u,""auxiliary,助詞"",,,{},,)" "(v,""verb,動詞"",出現(xiàn),{simple},simple,{出現(xiàn)})" "(v,""verb,動詞"",了,{simple},simple,{了})" "(n,""noun,名詞"",百家爭鳴,{simple},simple,{百家爭鳴})" "(u,""auxiliary,助詞"",的,{},,)" "(n,""noun,名詞"",現(xiàn)象,{simple},simple,{現(xiàn)象})"
select to_tsvector('chinese_zh', '春秋、戰(zhàn)國是中國歷史上思想迸發(fā)的時代,出現(xiàn)了百家爭鳴的現(xiàn)象');
執(zhí)行結果:
"'上思':4 '中國':2 '了':9 '出現(xiàn)':8 '歷史':3 '想':5 '時代':7 '是':1 '現(xiàn)象':11 '百家爭鳴':10 '迸發(fā)':6"
可以看到春秋和戰(zhàn)國沒有出現(xiàn)在里面,這里我們把t,time,時語素
的映射添加下
ALTER TEXT SEARCH CONFIGURATION chinese_zh ADD MAPPING FOR t WITH simple;
再執(zhí)行上面的語句就會得到下面的結果
"'上思':6 '中國':4 '了':11 '出現(xiàn)':10 '歷史':5 '想':7 '戰(zhàn)國':2 '時代':9 '春秋':1 '是':3 '現(xiàn)象':13 '百家爭鳴':12 '迸發(fā)':8"
可以看到春秋和戰(zhàn)國已經(jīng)出現(xiàn)在文本向量的結果中了。我們搜索下春秋看下
select to_tsquery('戰(zhàn)國') @@ to_tsvector('chinese_zh', '春秋、戰(zhàn)國是中國歷史上思想迸發(fā)的時代,出現(xiàn)了百家爭鳴的現(xiàn)象');
true
添加自定義詞典(txt)
select to_tsquery('二十四節(jié)谷') @@ to_tsvector('chinese_zh', '春秋、戰(zhàn)國是中國歷史上思想迸發(fā)的時代,在二十四節(jié)谷出現(xiàn)了百家爭鳴的現(xiàn)象'); false
這里竟然沒有,仔細觀察上面對這個句子的向量化分析,破案了,沒有把‘二十四節(jié)谷’這個詞作為一個整體
'上思':6 '中國':4 '了':11 '出現(xiàn)':10 '歷史':5 '想':7
在以下位置創(chuàng)建客戶字典/usr/share/postgresql/14/tsearch_data/kkdict.utf8.txt
:(必須在該目錄中)
#word TF IDF ATTR 二十四節(jié)谷 1 1 n
然后修改/var/lib/postgresql/data/posrgresql.conf
,在末尾添加以下行: zhparser.extra_dicts = 'kkdict.utf8.txt'
select ts_debug('chinese_zh', '春秋、戰(zhàn)國是中國歷史上思想迸發(fā)的時代,在二十四節(jié)谷出現(xiàn)了百家爭鳴的現(xiàn)象'); (n,"noun,名詞",二十四節(jié)谷,{simple},simple,{二十四節(jié)谷})
可見現(xiàn)在已經(jīng)變成一個名詞了。
創(chuàng)建索引
這里使用to_tsvector函數(shù)方式,不單獨增加一列tsvector字段
create table testing( title text ); insert into testing values('春秋、戰(zhàn)國是中國歷史上思想迸發(fā)的時代,出現(xiàn)了百家爭鳴的現(xiàn)象'); insert into testing values('春秋、戰(zhàn)國是中國歷史上思想迸發(fā)的時代,在二十四節(jié)谷出現(xiàn)了百家爭鳴的現(xiàn)象'); create index ind_testing on testing using gin (to_tsvector('chinese_zh', title));
這樣就可以在查詢中使用中文檢索了,注意當你數(shù)據(jù)量不夠的時候不會走索引,會直接便利。
select * from testing where to_tsquery('chinese_zh', '二十四節(jié)谷') @@ to_tsvector('chinese_zh', title);
總結
以上就是在PostgreSQL數(shù)據(jù)庫中使用中文全文搜索的實現(xiàn)方法的詳細內容,更多關于PostgreSQL中文全文搜索的資料請關注腳本之家其它相關文章!
相關文章
postgresql 實現(xiàn)多表關聯(lián)刪除
這篇文章主要介紹了postgresql 實現(xiàn)多表關聯(lián)刪除操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01Navicat連接postgresql時出現(xiàn)'datlastsysoid?does?not?exist&
這篇文章主要給大家介紹了關于Navicat連接postgresql時出現(xiàn)'datlastsysoid?does?not?exist'報錯問題的完美解決辦法,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2024-02-02PostgreSQL查詢和處理JSON數(shù)據(jù)
這篇文章主要給大家介紹了關于PostgreSQL查詢和處理JSON數(shù)據(jù)的相關資料,需要的朋友可以參考下2023-11-11對PostgreSQL中的慢查詢進行分析和優(yōu)化的操作指南
在數(shù)據(jù)庫的世界里,慢查詢就像是路上的絆腳石,讓數(shù)據(jù)處理的道路變得崎嶇不平,想象一下,你正在高速公路上飛馳,突然遇到一堆減速帶,那感覺肯定糟透了,本文介紹了怎樣對?PostgreSQL?中的慢查詢進行分析和優(yōu)化,需要的朋友可以參考下2024-07-07PostgreSql 導入導出sql文件格式的表數(shù)據(jù)實例
這篇文章主要介紹了PostgreSql 導入導出sql文件格式的表數(shù)據(jù)實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01