閱讀871 返回首頁    go 阿裏雲 go 技術社區[雲棲]


PostgreSQL 中英文混合分詞特殊規則(中文單字、英文單詞) - 中英分明

標簽

PostgreSQL , 正則表達式 , 分詞 , 拆分


背景

某個業務係統有一個這樣的要求:

分詞後,要求,英文以單詞形式出現,中文(多字節字符)以單字符形式出現。

這樣的需求,需要如何來實現呢?

自定義分詞規則UDF

切詞的一些隱含參數,請參考:

《使用阿裏雲PostgreSQL zhparser時不可不知的幾個參數》

要出現單字,我們需要這樣來設置,對於多字節字符,設置單切。

postgres=# set zhparser.multi_zall=on;  
postgres=# SELECT array_to_tsvector(array_agg(token)) from ts_debug('testzhcfg', '保障房資金壓力 hello digoal')   
           where (char_length(token)=1 and octet_length(token)<>1 ) or (char_length(token)=octet_length(token));  
                  array_to_tsvector                    
-----------------------------------------------------  
 'digoal' 'hello' '保' '力' '壓' '房' '資' '金' '障'  
(1 row)  

以上滿足業務需求,中文按字,英文按分詞。

下麵我們寫一個UDF,編譯使用。

create or replace function udf_to_tsvector(regconfig,text) returns tsvector as $$  
  SELECT array_to_tsvector(array_agg(token)) from ts_debug($1, $2)   
    where (char_length(token)=1 and octet_length(token)<>1 ) or (char_length(token)=octet_length(token));  
$$ language sql strict immutable;  

測試,滿足業務需求

postgres=# select udf_to_tsvector('testzhcfg', '保障房資金壓力 hello digoal');  
                   udf_to_tsvector                     
-----------------------------------------------------  
 'digoal' 'hello' '保' '力' '壓' '房' '資' '金' '障'  
(1 row)  

最後更新:2017-11-12 01:34:49

  上一篇:go  HTAP數據庫 PostgreSQL 場景與性能測試之 1 - (OLTP) 點查
  下一篇:go  PostgreSQL Oracle兼容性 - 計算字符長度與字節長度(char(?) 與varchar(?)空格如何計算長度)