辞書は、検索の対象とならない単語(ストップワード)を削除するために使われます。同じ単語から派生した異なる形態の単語が照合するようにするために、単語を正規化するためにも使われます。検索の品質を向上するという面以外にも、正規化とストップワードの削除は、tsvector表現の文書のサイズを小さくし、結果として性能を向上させます。正規化は常に言語学的な意味を持つとは限らず、通常は用途の意味論に依存します。正規化の例を示します。Ispell辞書は入力された単語を正規化された形式に変換しようとします。語幹辞書は単語の終了部を削除します。以下のようなURLが同一のURLに一致するように正規化することができます。http://www.pgsql.ru/db/mw/index.htmlhttp://www.pgsql.ru/db/mw/http://www.pgsql.ru/db/../db/mw/index.html色の名前は、16進値に変換できます。FF00FF数をインデックス付けする際には、可能な範囲を縮小するために、端数を削除することができます。3.14は同じことになります。辞書は、トークンを入力し、以下を返すプログラムです。辞書が入力トークンを認識しない場合はNULLPostgreSQLは、多くの言語に定義済の辞書を提供しています。カスタムパラメータを使った新しい辞書を作るために使えるテンプレートもいくつかあります。定義済の辞書のテンプレートについては、以下で述べています。今あるテンプレートが適当でないのなら、新しいものを作ることもできます。例は、PostgreSQLの配布物のcontrib/をご覧下さい。テキスト検索設定は、パーサと、パーサの出力トークンを処理する辞書の集合を結び付けます。パーサが返却する各々のトークン型に対して、設定で辞書のリストを指定します。パーサがあるトークン型を見つけると、ある辞書が単語を認識するまでリスト中の辞書が順番に調べられます。ストップワードであるか、あるいはどの辞書もトークンを認識しない場合はそれは捨てられ、インデックス付けや検索の対象となりません。通常、非NULLを返す最初の辞書の出力が結果を決めることになり、他の残りの辞書は参照されません。フィルタリング辞書は与えられたワードを変更し、それを続く辞書へ渡すことができます。辞書をリストする一般的な方法は、まずもっとも範囲の狭い、特定用途向の辞書を配置し、次にもっと一般的な辞書を置き、最後にSnowball語幹処理やsimple辞書のような、すべてを認識する非常に一般的な辞書を置くことです。英語辞書、そしてSnowball英語語幹辞書に結び付けることができます。english_stem;フィルタリング辞書は、リスト中の好きな場所へ配置できます。(役に立たなくなるリストの最後を除きます。フィルタリング辞書は、後続の辞書の処理を単純化するために、一部の文字の正規化を行うのに有用です。フィルタリング辞書はunaccentモジュールで実施される様な、アクセント記号が付与された文字からアクセント記号を取り除くのに使用することができます。ストップワードストップワードは、ほとんどすべての文書に現れるような非常に一般的で、ほかのものと同じようには扱う価値のない単語です。全文検索の際には無視して構いません。すべての英語のテキストはaやtheのような単語を含んでおり、インデックスの中にそれらを入れても役に立ちません。ストップワードはtsvector中の位置に影響を与えるので、結局ランキングにも影響があります。4は、ストップワードのために失われています。ストップワードの有無により、文書のために計算されたランクは非常に影響を受けます。0.1ストップワードをどのように扱うかは、特定の辞書に任されています。ispell辞書はまず単語を正規化し、そして、ストップワードのリストを検索します。Snowball語幹抽出はまずストップワードのリストを検査します。動作が異なる理由は、ノイズが紛れ込む可能性を減らすことです。simple辞書simple辞書テンプレートは、入力トークンを小文字に変換し、ストップワードのファイルに対してチェックすることによって動作します。ファイルの中にあれば、空の配列が返却され、そのトークンは捨てられます。ないときは、小文字形式の単語が正規化された語彙素として返却されます。別の方法としては、ストップワードではないものは、認識できないものとすることもできます。することにより、それらをリスト中の次の辞書に渡すことができます。simpleテンプレートを使った辞書定義の例を示します。english);ここで、englishは、ストップワードファイルのベースネームです。ファイルのフルネームは、$SHAREDIR/tsearch_data/english.stopです。$SHAREDIRは、PostgreSQLインストール先の共有データディレクトリです。これは、よく/usr/local/share/postgresqlに置いてあります。--sharedirを使ってください)。ファイル形式は、単に1行ごとに単語を書くだけです。空行と、後方の空白は無視されます。大文字は小文字に変換されます。このファイルの内容に関する処理はこれだけです。これで辞書のテストができます。{}また、ストップワードファイルの中に見つからないときに、小文字に変換した単語を返す代わりに、NULLを返すことを選ぶこともできます。この挙動は、辞書のAcceptパラメータをfalseに設定することで選択されます。trueでは、simple辞書は、辞書リストの最後に置かなければ意味がありません。後続の辞書にトークンを渡すことがないからです。falseは、後続の辞書が少なくとも一つはあるときに意味があります。注意ほとんどの辞書の形式は、ストップワードファイルのように設定ファイルに依存します。これらのファイルは必ずUTF-8エンコーディングにしてください。データベースセッションの中で最初に使われる際に、一度だけ読み込まれます。DICTIONARYを発行してください。これは実際にはどんなパラメータ値をも変更しない"ダミー"の更新でよいです。同義語辞書この辞書テンプレートは、単語を同義語に置き換える辞書を作るために使われます。語句はサポートされていません(そのためには類語テンプレート(項12.6.4)を使ってください)。同義語辞書は、言語学的な問題、たとえば、英語語幹辞書が"Paris"という単語を"pari"に縮小してしまうのを防ぎます。parisという行を同義語辞書に登録し、english_stem辞書の前に置くようにするだけでよいのです。上の例ではmy_synonymsです。なります(ここで$SHAREDIRは、PostgreSQLをインストールした際の、共有データディレクトリです)。ファイルの形式は、置き換え対象の1単語につき1行で、単語には空白で区切られた同義語が後に続きます。空行、後方の空白は無視されます。synonymテンプレートはまた、CaseSensitiveというオプションパラメータを持っており、デフォルトはfalseです。CaseSensitiveがfalseの時は、同義語辞書内の単語は入力トークンと同様に小文字に変換されます。trueの時は、単語とトークンは小文字に変換されずそのまま比較されます。アスタリスク(*)は設定ファイル中の同義語の最後に付与することができます。これは同義語を接頭語とすることを意味します。アスタリスクは、エントリがto_tsvector()で使用される場合には無視されますが、to_tsquery()で使用される場合、結果は前方一致を伴った問い合わせになるでしょう。(詳しくは項12.3.2を見てください。$SHAREDIR/tsearch_data/synonym_sample.synに以下の様なエントリをもっていたとします。index*この場合、次のような結果を得ることになります。類語辞書(TZと略されることがあります)は、単語と語句の関係情報を集めたものです。基本的には、類語辞書は、非優先用語を優先用語に置き換え、オプションで元の用語もインデックス付けのため保存します。PostgreSQLの現在の類語辞書の実装は、同義語辞書を拡張し、語句のサポートを追加したものです。類語辞書は、以下のようなフォーマットの設定ファイルを必要とします。word(s)...ここで、コロン(:)は、語句とその置き換え対象の区切りです。類語辞書は、副辞書(辞書設定で指定します)を、一致する語句をチェックする前に入力テキストを正規化するために使います。副辞書はただ一つだけ選べます。副辞書が単語を認識できない場合はエラーが報告されます。その場合は、その単語の利用を止めるか、副辞書にそのことを教えなければなりません。アスタリスク(*)をインデックス付けされた単語の先頭に置くことにより、副辞書の適用をスキップできます。すべてのサンプルの単語は、副辞書に認識されなければなりません。複数の類語が照合するときは、類語辞書はもっとも長いものを選びます。語句は、最後の定義を使って分解されます。特定のストップワードを副辞書に認識するように指定することはできません。その代わり、ストップワードが出現する位置を?でマークします。aとtheが副辞書によればストップワードだったとします。両方ともswswに置き換えられます。類語辞書は語句を認識することができるので、状態を記憶してパーサと連携を保たなければなりません。類語辞書は、この機能を使って次の単語を引き続き処理するのか、単語の蓄積を止めるのかを決定します。類語辞書の設定は注意深く行わなければなりません。7のような類語辞書の定義は、トークン型uintが類語辞書にアサインされていないので動きません。類語辞書はインデックス付けの際に利用されるので、類語辞書を設定変更すると、再インデックス付けが必要になります。他のほとんどの辞書では、ストップワードを追加あるいは削除するような小さな変更は、インデックス付けを必要としません。新しい類語辞書を定義するには、thesaurusテンプレートを使います。pg_catalog.english_stem);ここで、thesaurus_simpleは新しい辞書の名前です。mythesaurusは、類語設定ファイルのベースネームです。(フルパスは、$SHAREDIR/tsearch_data/mythesaurus.thsとなります。ここで、$SHAREDIRはインストール時の共有データディレクトリです。)類語正規化で使用するpg_catalog.english_stemは副辞書です(ここでは、Snowball英語語幹辞書)。副辞書にはそれ用の設定(たとえばストップワード)があることに注意してください。ここではそれは表示していません。これで、類語辞書thesaurus_simpleを、設定中の希望のトークンにバインドすることができるようになります。天文学の単語の組合わせを含む単純な天文学用のthesaurus_astro類語を考えます。crab以下で辞書を作り、トークン型を天文学類語辞書と英語の語幹辞書に結び付けます。english_stem;さあ、これでどのように動くか試せます。ts_lexizeは類語をテストする目的にはあまり有用ではありません。それは入力を単一のトークンとして扱うからです。その代わりに、plainto_tsqueryとto_tsvectorを使って入力文字列を複数のトークンに分解します。'sn':1原則として、引数を引用符で囲めばto_tsqueryが使えます。starsに照合していることに注意してください。語幹処理がeとsを削除しています。置き換え後の語句とオリジナルの語句の両方をインデックス付けするには、定義の右項にオリジナルを追加するだけで良いです。Ispell辞書Ispell辞書テンプレートは、形態論辞書を提供します。これによって、言語学的に多様な単語の形態を同じ語彙素に変換することができます。bank'sに照合します。PostgreSQLの標準配布には、Ispellの設定ファイルは含まれていません。多くの言語用の辞書がIspellで入手できます。Wikiで入手できます。Ispell辞書を作るには、組み込みのispellテンプレートを使い、いくつかパラメータを指定します。StopWordsは、辞書のベースネーム、接辞ファイル、ストップワードファイルを指定します。ストップワードファイルは、上で説明したsimple辞書と同じ形式です。ほかのファイルの形式はここでは説明されませんが、上にあげたウェブサイトに説明があります。Ispell辞書は通常限られた数の単語を認識します。なんでも認識できるSnowball辞書のような、より適用範囲の広い辞書による後処理が必要です。Ispell辞書を使って複合語を分割することができます。これは優れた機能です。controlled文を使う特別なフラグを指定しなければならないことに注意してください。zノルウェー語の例をいくつか示します。MySpellは複合語をサポートしていません。Hunspellは複合語の高度なサポートを提供しています。いまのところ、PostgreSQLはHunspellの基本的な複合語操作しかサポートしていません。Porterのプロジェクトに基づいています。Snowballは今では多くの言語用の語幹アルゴリズムを提供しています(詳細はSnowballのサイトを参照してください)。各々のアルゴリズムにより、その言語において単語の共通部分を取りだし、基本部もしくは語幹の綴りに縮退させることができます。Snowball辞書には、どの語幹処理を使うかを識別する言語パラメータが必須で、加えて、オプションで無視すべき単語のリストを保持するストップワードファイルを指定することもできます。projectから提供されています。以下と同じ組み込みの定義があります。english);ストップワードファイルの形式はすでに説明されているものと同じです。Snowball辞書は、単純化できるかどうかに関係なく、すべての単語を認識するので、辞書リストの最後に置く必要があります。他の辞書の前に置くのは意味がありません。Snowball辞書は決してトークンを次の辞書に渡さないからです。