2017-10-01 12 views
2

私はユーザテーブルを持つpostgresqlデータベースを持っています。各ユーザは(ユニコードで)名前を持っています。名前に少なくとも1つのヘブライ文字が含まれているすべてのユーザーを検索したいと思います。私はregexを使って考えました。ヘブライ語の名前を持つすべてのレコードを見つける

select * from users 
where name ~ '[א-ת]'; 

正規表現より効率的なアプローチがありますか?私は名前の列にBツリーのインデックスを持っています。ディスクサイズに関して@FuzzyTree

 B-tree GIST GIN 
user 0.04 0.04 0.03 
sys 0.02 0.04 0.01 
total 0.06 0.08 0.04 

によってsuggestedとしてpg_trgmモジュールと異なるインデックスを使用

更新

は、GINインデックスはGISTの一方の0.2Xおよび0.8XのありますBツリー。したがって、少なくとも私のユースケースでは、ここに勝者があります。 YMMV(例:インデックスの作成と更新をベンチマークしていない)バージョン:postgres 9.6。

+1

あなたは私たちが望む、すでに何をすべきであり、あなたは、いくつかのコードスニペットを提供する際、より便利な答えを得る可能性があること、以上の2K担当者で、さあご覧ください。 – Jan

+0

@Jan、何のためのスニペットですか?私は*何をするか*どのように何をするか*求めています。私が現在のregexコードのスニペットを追加することができます。 – dimid

答えて

1

ブール型の列、つまりis_hebrew_nameを作成して、正規表現を使用して一度更新してから定期的なインデックスを作成することもできます。

あなたが別の列を追加しないと、あなたはV9.3以降を実行している場合は、name

CREATE EXTENSION pg_trgm; 
CREATE INDEX trgm_idx ON users USING GIST (name gist_trgm_ops); 

GINまたはGISTインデックスを作成するためにpg_trgmモジュールを使用することを検討しては、 pg_trgmモジュールは、 非常に高速な類似検索を目的として、 がテキスト列上にインデックスを作成できるGiSTおよびGINインデックス演算子クラスを提供します。これらのインデックスタイプは、前述の類似性演算子の をサポートし、さらに、LIKE、ILIKE、〜および〜*クエリの トリグラムベースのインデックス検索をサポートします。

インデックスの検索は、通常の 式からトリグラムを抽出し、インデックスで検索します。より多くのトリグラム は正規表現から抽出することができ、より効果的なインデックス検索は です。 Bツリーベースの検索とは異なり、検索文字列 は左にアンカーされる必要はありません。

LIKEと正規表現の両方の検索では、抽出可能なトリグラムを持たない パターンはフルインデックスの スキャンに縮退することに注意してください。

GiSTインデックスとGINインデックスの間の選択は、 のGiSTとGINのパフォーマンス特性に依存します。これについては を参照してください。

詳細情報についてはhttps://www.postgresql.org/docs/9.6/static/pgtrgm.html

+0

ありがとう、私は[テスト](https://stackoverflow.com/questions/21830/postgresql-gin-or-gist-indexes#26398)と結果を報告します。 – dimid

+1

ベンチマークで更新。 – dimid

関連する問題