PostgreSQL unaccent

2021-09-16 17:34 更新
F.43.1. 配置
F.43.2. 用法
F.43.3. 函數(shù)

unaccent是一個(gè)文本搜索字典,它能從詞位中移除重音(附加符號(hào))。它是一個(gè)過濾詞典,這表示它的輸出總是會(huì)被傳遞給下一個(gè)字典(如果有),這和字典的通常行為不同。這允許為全文搜索做與重音無關(guān)的處理。

unaccent的當(dāng)前實(shí)現(xiàn)不能被用作thesaurus字典的正規(guī)化字典。

這個(gè)模塊被認(rèn)為是可信的,也就是說,它可以由對(duì)當(dāng)前數(shù)據(jù)庫具有CREATE權(quán)限的非超級(jí)用戶安裝。

F.43.1. 配置

unaccent字典接受下列選項(xiàng):

  • RULES是包含翻譯規(guī)則列表的文件的基本名。這個(gè)文件必須被存儲(chǔ)在$SHAREDIR/tsearch_data/(這里$SHAREDIR表示PostgreSQL安裝的共享數(shù)據(jù)目錄)中。它的名稱必須以.rules(不包含在 RULES參數(shù)中)結(jié)束。

規(guī)則文件具有下面的格式:

  • 每一行表示一個(gè)由帶有重音的字符和不帶重音的字符構(gòu)成的對(duì)。第一個(gè)字符將被翻譯成第二個(gè)。例如:

    à        A
    á        A
    ?        A
    ?        A
    ?        A
    ?        A
    ?        AE
    

    兩個(gè)字符必須由空格分隔,并且一行上的任何前導(dǎo)或尾隨空白都將被忽略。

  • 或者,如果一行只給出一個(gè)字符,則刪除該字符的實(shí)例; 這在用單獨(dú)的字符表示重音的語言中是有用的。

  • 實(shí)際上,每個(gè)字符可以是不包含空格的任何字符串,因此, 除了去除變音符之外,unaccent字典也可以用于其他類型的字符串替換。

  • 與其他PostgreSQL文本搜索配置文件一樣, 規(guī)則文件必須以UTF-8編碼方式存儲(chǔ)。加載時(shí),數(shù)據(jù)將自動(dòng)轉(zhuǎn)換為當(dāng)前數(shù)據(jù)庫的編碼。 任何含有不可翻譯字符的行都將被忽略,因此規(guī)則文件可以包含當(dāng)前編碼中不適用的規(guī)則。

unaccent.rules中可以找到一個(gè)更完整的例子,它可以直接用于大部分歐洲語言,當(dāng)unaccent模塊被安裝時(shí),它被安裝在$SHAREDIR/tsearch_data/中。

F.43.2. 用法

安裝unaccent擴(kuò)展會(huì)創(chuàng)建一個(gè)文本搜索模板unaccent和一個(gè)基于前者的字典unaccent。unaccent字典有默認(rèn)的參數(shù)設(shè)置RULES='unaccent',這會(huì)讓該字典使用標(biāo)準(zhǔn)的unaccent.rules文件。如果希望修改該參數(shù),可以

mydb=# ALTER TEXT SEARCH DICTIONARY unaccent (RULES='my_rules');

或者基于該模板創(chuàng)建新的字典。

要測(cè)試該字典,你可以嘗試:

mydb=# select ts_lexize('unaccent','H?tel');
 ts_lexize
-----------
 {Hotel}
(1 row)

這里是一個(gè)展示把unaccent字典插入到一個(gè)文本搜索配置的例子:

mydb=# CREATE TEXT SEARCH CONFIGURATION fr ( COPY = french );
mydb=# ALTER TEXT SEARCH CONFIGURATION fr
        ALTER MAPPING FOR hword, hword_part, word
        WITH unaccent, french_stem;
mydb=# select to_tsvector('fr','H?tels de la Mer');
    to_tsvector
-------------------
 'hotel':1 'mer':4
(1 row)

mydb=# select to_tsvector('fr','H?tel de la Mer') @@ to_tsquery('fr','Hotels');
 ?column?
----------
 t
(1 row)

mydb=# select ts_headline('fr','H?tel de la Mer',to_tsquery('fr','Hotels'));
      ts_headline
------------------------
 <b>H?tel</b> de la Mer
(1 row)

F.43.3. 函數(shù)

unaccent()函數(shù)從一個(gè)給定的字符串中移除重音(附加符號(hào))。基本上,它是unaccent字典的一個(gè)包裝器,但是它能在普通的文本搜索環(huán)境之外使用。

unaccent([dictionary regdictionary, ] string text) returns text

如果省略dictionary參數(shù),則使用名為unaccent并且與unaccent()函數(shù)有相同模式的文本搜索詞典。

例如:

SELECT unaccent('unaccent', 'H?tel');
SELECT unaccent('H?tel');


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)