2009-07-30 16 views
4

PostgreSQL 8.3で全文検索をしようとしています。それはうまくいったので、私は同義語辞書を使って同義語マッチング(例えば、 'bob' == 'robert')を加えました。それも素晴らしい作品です。しかし、私はそれが明らかに言葉だけの同義語を持つことができることに気づいた。つまり、「アル」は「アルバート」と「アレン」になることはできません。PostgreSQL全文検索で複数の同義語が一致する

これは間違いありませんか? PostgreSQLの同義語辞書に複数の辞書マッチを持つ方法はありますか?

bob robert 
bobby robert 
al  alan 
al  albert 
al  allen 

とフルテキスト検索設定を作成SQL::

CREATE TEXT SEARCH DICTIONARY nickname (TEMPLATE = synonym, SYNONYMS = nickname); 
CREATE TEXT SEARCH CONFIGURATION dxp_name (COPY = simple); 
ALTER TEXT SEARCH CONFIGURATION dxp_name ALTER MAPPING FOR asciiword WITH nickname, simple; 

私が間違っているのは何を参考に

は、ここに私のサンプル辞書ファイルのですか?ありがとう!

答えて

4

これは、同義語がどのように機能するかについての制限です。あなたにできることは同様にそれを好転です:

bob robert 
bobby robert 
alan al 
albert al 
allen al 

それはそれらのいずれかが同じことを一致するかを検索することで同じ結果を与える必要があります。

+0

Hmm。それは、多分多くの関係を持つ可能性のある方法がないことを意味するとは思うが、助けになる。たとえば、これは是正することは不可能である。 VINヴィンセント VINヴィンチェンツォ ヴィニー・ヴィンセント ヴィニーヴィンチェンツォ おかげしかし! –

2

辞書はあなたがlexizeたときに、それ以外の場合は返すためにどの単語を知ることができません単語や語彙素との間の関数関係を定義する必要があります。あなたの例では、alは3つの異なる値にマップされ、多値関数を定義し、lexize関数は何を返すべきかを知らない。 Magnusが示しているように、適切な名前alan, albert, allenからニックネームalに語彙を付けることができます。

しかし、FTS辞書のポイントは、変換そのものを行うのではなく、意味的に関連する単語の効率的なインデックス作成を可能にすることです。これは、字句がどんな言語的意味でも元の入力に似る必要はないことを意味します。多対多の関係を定義することは不可能ですが、本当に必要ですか?

vin  grob 
vincent grob 
vincenzo grob 
vinnie  grob 

をして(あなたがしたいと思う理由に別の話ですが)同じ効果を得る:例えば、あなたのvin例解決します

vin  vin 
vincent vin 
vincenzo vin 
vinnie  vin 

をあなたもこれを行うことができます。

したがって、Vincentという11バージョンのドキュメントを解析する場合、to_tsvector関数は、前者の場合はvin:11、後者の場合はgrob:11を返します。

関連する問題