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

德哥發表於2017-11-12

標籤

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)  


相關文章