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