2025年9月25日: PostgreSQL 18 釋出!
支援版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0

F.48. unaccent — 一個移除變音符號的文字搜尋詞典 #

unaccent 是一個文字搜尋詞典,用於從詞位 (lexemes) 中移除變音符號。它是一個過濾詞典,這意味著它的輸出總是會傳遞給下一個詞典(如果存在的話),這與普通詞典的行為不同。這允許在全文搜尋中實現不區分變音符號的處理。

unaccent 的當前實現不能作為 thesaurus 詞典的規範化詞典使用。

此模組被認為是受信任的,這意味著非超級使用者也可以在其擁有的資料庫上安裝它,前提是他們具有 CREATE 許可權。

F.48.1. 配置 #

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)。

F.48.2. 用法 #

安裝 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)

F.48.3. 函式 #

unaccent() 函式從給定的字串中移除變音符號。它基本上是 unaccent 型別詞典的一個包裝器,但它可以在正常的文字搜尋上下文之外使用。

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

如果省略 dictionary 引數,則使用在 unaccent() 函式本身相同模式下命名的文字搜尋詞典 unaccent

例如

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

提交更正

如果您在文件中看到任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。