unaccent
是一個文字搜尋詞典,用於從詞位 (lexemes) 中移除變音符號。它是一個過濾詞典,這意味著它的輸出總是會傳遞給下一個詞典(如果存在的話),這與普通詞典的行為不同。這允許在全文搜尋中實現不區分變音符號的處理。
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/
中。這個規則檔案將帶變音符號的字元翻譯成相同的無變音符號字元,並且還將連字(ligatures)展開成等效的簡單字元序列(例如,Æ 翻譯成 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');
如果您在文件中看到任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。