2013-07-13 11 views
6

私はデータベースを持っており、次のような検索をテーブルで検索できます: select * from table where "abc%def%ghi " または select * from table"%def%ghi "のような列 これはあまりにも遅くないように列をインデックスする方法はありますか?速い部分文字列検索のためにポストグルでインデックスを付ける方法はありますか

編集: 私はまた、データベースが読み取り専用で、頻繁に更新されないことを明確にすることができます。 likeオペレータの使用パターンは、別の戦略が必要とされる場合に%で始まらない場合にのみ動作する演算子クラスvarchar_pattern_ops又はtext_pattern_ops

create index test_index on test_table (col varchar_pattern_ops); 

のいずれかの

+0

私はあなたがフルテキスト[が必要だと思いますインデックス](http://www.postgresql.org/docs/8.3/static/textsearch.html) –

+0

この質問は、http://dba.stackexchange.com/に適しています –

答えて

2

+2

フルテキスト検索が必要な場合は、 [pg_trgm](http://www.postgresql.org/docs/current/static/pgtrgm.html)が動作する可能性があります。私は過去にそれを使用していたし、特定の条件下ではかなりうまく動作する。インデックスは非常に大きくなることに注意してください。 IIRC、索引付き列のサイズの約2.5倍。 – bma

13

テキスト検索とインデックス作成のためのオプションが含ま:プレフィックス検索のためのサポートを含む辞書ベースの検索、と

、私は唯一のトライグラムインデックスは、文字列に中置検索を行うと、辞書の単語を探していないことから、あなたを助けることができるようになりますことを言うと思います。残念ながら、トライグラムインデックスは巨大なであり、むしろ非効率です。何らかの魔法のようなパフォーマンスの向上は期待せず、データベースエンジンを構築して最新の状態に保つために多くの作業を行うことに注意してください。

1

あなたは、例えば、テーブル全体でユニークな部分文字列を取得するだけの必要がある場合は、サブストリングのインデックスを作成することができます。

CREATE INDEX i_test_sbstr ON tablename (substring(columname, 5, 3)); 
-- start at position 5, go for 3 characters 

It is important that the substring() parameters in the index definition are 
the same as you use in your query. 

REF:http://www.postgresql.org/message-id/[email protected]

関連する問題