2009-09-30 10 views
24

PostgreSQL全文検索では、デフォルトの動作ではない伝統的なストップワード( 'a'、 'the'、 'if'など)をインデックスに登録して検索する必要があります。たとえば、ユーザーがクエリの検索結果を検索したいと思うかもしれません。PostgreSQLの全文検索でストップワードをプログラムで設定することはできますか?

documentationは、$SHAREDIR/tsearch_data/english.stop(たとえば)に空のストップワード辞書を作成することでこれを実現できることを示していますが、これはデプロイメントを複雑にします。 PostgreSQLのストップワード処理をSQLで設定できるようにしたい。これは可能ですか?もしそうなら、サンプルSQL文を提供できますか?

答えて

34

、あなたは簡単にすべての単語を停止なしストップワードを使用していない間で切り替えることができます。 カスタム検索設定でこれをacheiveすることができます

(1)あなたは、たとえば、ストップワードファイルを使用せずにカスタム辞書を作成することができます

CREATE TEXT SEARCH DICTIONARY english_stem_nostop (
    Template = snowball 
    , Language = english 
); 

注意を、私は取り残さ上記にStopWordsパラメータ。

(2)次に、あなたの新しい辞書を使用するために新しい構成を作成します。

CREATE TEXT SEARCH CONFIGURATION public.english_nostop (COPY = pg_catalog.english); 
ALTER TEXT SEARCH CONFIGURATION public.english_nostop 
    ALTER MAPPING FOR asciiword, asciihword, hword_asciipart, hword, hword_part, word WITH english_stem_nostop; 

(3)次に、(あるいはあなたがdefault_text_search_configオプションを毎回変更することができます)あなたが使用したい設定を指定して検索するときに、例えば:

SELECT 
    title 
FROM 
    articles 
WHERE 
    to_tsvector('english_nostop', COALESCE(title,'') || ' ' || COALESCE(body,'')) 
    @@ to_tsquery('english_nostop', 'how & to'); 

あなたは、通常の設定を使用するには、上記SQLでちょうど'english'を指定することができます。

のみストップワードがあるので、標準的な設定を使用して通知をもたらすであろうことを注意、この例では


クマは念頭に置いただし、以下:

  • あなたはインデックスを使用している場合は、次の2つが必要になります - 構成ごとに1を。 (これらのドキュメント:tsearch tablestriggersを参照してください)。
  • 上記の手順#2(「Parsers」を参照)に従って、このマッピングを使用するパーサートークンを再度確認します。
+0

ありがとう、catchdave - それは私が探していたものです。 – tomd

2

いいえ、ストップワードはそのファイルでのみ設定可能です。ファイルを変更するサーバー側の機能を持たせることができますが、これはファイルを書き込みする必要があります。これは、おそらく必要ないpostgresサービスユーザーが可能です。前の回答に対するあなたのコメントを1として

+1

ありがとうございました。明らかにするには、*任意の*ストップワードファイルを使用しないようにPostgreSQLに指示することはできません。 – tomd

関連する問題