支援版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0

F.46. unaccent — 移除變音符號的文字搜尋字典 #

unaccent 是一個文字搜尋字典,它會從語彙基元中移除重音符號(變音符號)。它是一個過濾字典,這意味著它的輸出總是傳遞到下一個字典(如果有的話),這與字典的正常行為不同。這允許對全文搜尋進行不區分重音符號的處理。

unaccent 的目前實作無法用作 thesaurus 字典的正規化字典。

此模組被認為是受信任的,也就是說,具有目前資料庫 CREATE 權限的非超級使用者可以安裝它。

F.46.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/ 中。此規則檔案將帶重音符號的字元翻譯為沒有重音符號的相同字元,並且還將連字擴展為等效的簡單字元系列(例如,Æ to AE)。

F.46.2. 用法 #

安裝 unaccent 擴充功能會建立一個文字搜尋範本 unaccent 和一個基於它的字典 unaccentunaccent 字典具有預設參數設定 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.46.3. 函式 #

unaccent() 函式會從給定的字串中移除重音符號(變音符號)。基本上,它是 unaccent 類型字典的包裝函式,但它可以在正常的文字搜尋環境之外使用。

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

如果省略 dictionary 引數,則會使用名為 unaccent 且出現在與 unaccent() 函式本身相同的結構描述中的文字搜尋字典。

例如:

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

提交更正

如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的地方,請使用此表單來回報文件問題。