unaccent
は語彙素からアクセント(発音区分記号)を取り除く全文検索用の辞書です。
これはフィルタ処理を行う辞書、つまり、標準の動作と異なり、その出力が常に次の辞書(もしあれば)に渡されるものです。
これにより全文検索においてアクセントを無視した処理を行うことができます。
現在のunaccent
の実装ではthesaurus
辞書向けの正規化用辞書として使用することはできません。
unaccent
辞書は以下のオプションを受け付けます。
RULES
は翻訳規則の一覧を含むファイルのベースネームです。
このファイルは$SHAREDIR/tsearch_data/
内に格納しなければなりません。(ここで$SHAREDIR
はPostgreSQLインストレーションの共有データディレクトリを意味します。)
この名前は.rules
で終わらなければなりません。(.rules
はRULES
パラメータには含まれません。)
rulesファイルの書式は以下の通りです。
各行は、アクセント付き文字とその後にアクセントを取り除いた文字から構成される、1つの変換規則です。 一つ目が二つ目に変換されます。 以下に例を示します。
À A Á A Â A Ã A Ä A Å A Æ AE
2つの文字は空白で分けられていなければならず、行の先頭や末尾の空白は無視されます。
あるいは、一行に一文字だけ指定された場合、その文字は削除されます。これは、アクセントが分かれた文字で表現される言語では便利です。
実のところ、各「文字」は空白を含まなければいかなる文字列でも良いので、unaccent
辞書は発音区別符号の除去に加えて、部分文字列の置換などに使うこともできます。
他のPostgreSQLテキスト検索設定ファイルと同じように、rulesファイルはUTF-8エンコーディングで保存しなければなりません。 データはロード時に自動的に現在のデータベースのエンコーディングに変換されます。 rulesファイルが現在のエンコーディングで適用できない規則も含むことができるように、変換できない文字を含む行は単に無視されます。
unaccent.rules
は、ほとんどの欧州圏の言語で直接使用できる、より複雑な例です。
これはunaccent
モジュールをインストールした時に$SHAREDIR/tsearch_data/
にインストールされます。
このrulesファイルは、アクセント記号のある文字をアクセント記号のない同じ文字に変換し、また、合字を同等な普通の文字の並びに(例えば、Æを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)