unaccent
是一個文字搜尋字典,它會從語彙基元中移除重音符號(變音符號)。它是一個過濾字典,這意味著它的輸出總是傳遞到下一個字典(如果有的話),這與字典的正常行為不同。這允許對全文搜尋進行不區分重音符號的處理。
unaccent
的目前實作無法用作 thesaurus
字典的正規化字典。
此模組被認為是「受信任的」,也就是說,具有目前資料庫 CREATE
權限的非超級使用者可以安裝它。
unaccent
字典接受以下選項:
RULES
是包含翻譯規則清單的檔案的基本名稱。此檔案必須儲存在 $SHAREDIR/tsearch_data/
中(其中 $SHAREDIR
表示 PostgreSQL 安裝的共用資料目錄)。其名稱必須以 .rules
結尾(不包含在 RULES
參數中)。
規則檔案具有以下格式:
每一行代表一個翻譯規則,由帶重音符號的字元,接著是不帶重音符號的字元組成。第一個字元會被翻譯成第二個字元。例如:
À A Á A Â A Ã A Ä A Å A Æ AE
兩個字元必須以空白字元分隔,且會忽略一行的任何開頭或結尾空白字元。
或者,如果一行中只給出一個字元,則會刪除該字元的實例;這在重音符號由單獨字元表示的語言中非常有用。
實際上,每個「字元」可以是任何不包含空白字元的字串,因此 unaccent
字典可用於變音符號移除之外的其他子字串替換。
某些字元(例如數字符號)可能需要在其翻譯規則中使用空白字元。在這種情況下,可以使用雙引號將翻譯後的字元括起來。當在翻譯後的字元中包含雙引號時,需要使用第二個雙引號來轉義雙引號。例如:
¼ " 1/4" ½ " 1/2" ¾ " 3/4" “ """" ” """"
與其他 PostgreSQL 文字搜尋組態檔一樣,規則檔案必須儲存在 UTF-8 編碼中。載入時,資料會自動翻譯為目前資料庫的編碼。任何包含無法翻譯字元的行都會被靜默忽略,因此規則檔案可以包含不適用於目前編碼的規則。
一個更完整的範例,對大多數歐洲語言都很有用,可以在 unaccent.rules
中找到,當安裝 unaccent
模組時,它會安裝在 $SHAREDIR/tsearch_data/
中。此規則檔案將帶重音符號的字元翻譯為沒有重音符號的相同字元,並且還將連字擴展為等效的簡單字元系列(例如,Æ to AE)。
安裝 unaccent
擴充功能會建立一個文字搜尋範本 unaccent
和一個基於它的字典 unaccent
。unaccent
字典具有預設參數設定 RULES='unaccent'
,這使其可以立即與標準 unaccent.rules
檔案一起使用。如果您願意,您可以變更參數,例如:
mydb=# ALTER TEXT SEARCH DICTIONARY unaccent (RULES='my_rules');
或根據範本建立新的字典。
要測試字典,您可以嘗試:
mydb=# select ts_lexize('unaccent','Hôtel'); ts_lexize ----------- {Hotel} (1 row)
以下範例顯示如何將 unaccent
字典插入文字搜尋組態中:
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)
unaccent()
函式會從給定的字串中移除重音符號(變音符號)。基本上,它是 unaccent
類型字典的包裝函式,但它可以在正常的文字搜尋環境之外使用。
unaccent([dictionary
regdictionary
, ]string
text
) returnstext
如果省略 dictionary
引數,則會使用名為 unaccent
且出現在與 unaccent()
函式本身相同的結構描述中的文字搜尋字典。
例如:
SELECT unaccent('unaccent', 'Hôtel'); SELECT unaccent('Hôtel');
如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的地方,請使用此表單來回報文件問題。