★PostgreSQLカンファレンス2024 12月6日開催/チケット販売中★
他のバージョンの文書 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

F.43. unaccent

unaccentは語彙素からアクセント(発音区分記号)を取り除く全文検索用の辞書です。 これはフィルタ処理を行う辞書、つまり、標準の動作と異なり、その出力が常に次の辞書(もしあれば)に渡されるものです。 これにより全文検索においてアクセントを無視した処理を行うことができます。

現在のunaccentの実装ではthesaurus辞書向けの正規化用辞書として使用することはできません。

F.43.1. 設定

unaccent辞書は以下のオプションを受け付けます。

  • RULESは翻訳規則の一覧を含むファイルのベースネームです。 このファイルは$SHAREDIR/tsearch_data/内に格納しなければなりません。(ここで$SHAREDIRPostgreSQLインストレーションの共有データディレクトリを意味します。) この名前は.rulesで終わらなければなりません。(.rulesRULESパラメータには含まれません。)

rulesファイルの書式は以下の通りです。

  • 各行は、アクセント付き文字とその後にアクセントを取り除いた文字から構成される、1つの変換規則です。 一つ目が二つ目に変換されます。 以下に例を示します。

    À        A
    Á        A
    Â        A
    Ã        A
    Ä        A
    Å        A
    Æ        AE
    

    2つの文字は空白で分けられていなければならず、行の先頭や末尾の空白は無視されます。

  • あるいは、一行に一文字だけ指定された場合、その文字は削除されます。これは、アクセントが分かれた文字で表現される言語では便利です。

  • 実のところ、各文字は空白を含まなければいかなる文字列でも良いので、unaccent辞書は発音区別符号の除去に加えて、部分文字列の置換などに使うこともできます。

  • 他のPostgreSQLテキスト検索設定ファイルと同じように、rulesファイルはUTF-8エンコーディングで保存しなければなりません。 データはロード時に自動的に現在のデータベースのエンコーディングに変換されます。 rulesファイルが現在のエンコーディングで適用できない規則も含むことができるように、変換できない文字を含む行は単に無視されます。

unaccent.rulesは、ほとんどの欧州圏の言語で直接使用できる、より複雑な例です。 これはunaccentモジュールをインストールした時に$SHAREDIR/tsearch_data/にインストールされます。 このrulesファイルは、アクセント記号のある文字をアクセント記号のない同じ文字に変換し、また、合字を同等な普通の文字の並びに(例えば、ÆをAEに)展開します。

F.43.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.43.3. 関数

unaccent関数は与えられた文字列からアクセント(発音区別符号)を取り除きます。 基本的にこれはunaccent型の辞書のラッパです。しかし通常の全文検索以外の文脈で使用することができます。

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

引数dictionaryが省略された場合、unaccentという名前でunaccent()関数自体と同じスキーマにある全文検索用の辞書が使われます。

下記は使用例です。

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