2017-05-31 17 views
0

私はPostgreSQL(バージョン9.4)の何百万(80+ mio)のレコードを複数のカラムにわたって検索する最も速い方法を作成しようとしています。PostgreSQL全文検索サブ文字列を使って検索

は、私が試してみて、標準のPostgreSQLを使用したい、となど

私は現在、全文検索をテストしていますがhttps://blog.lateral.io/2015/05/full-text-search-in-milliseconds-with-postgresql/に続いてSolrありません。

これは機能しますが、より柔軟な検索方法をご希望です。

現在、私にex。 "Volvo"と "Blue"を含むもの私は検索文字列 "volvo blue"でレコードを見つけることができますが、LIKEと "%blu%"を使ったかのように "volvo blu" 。

フルテキスト検索で可能なことですか?

+0

FTSにはプレフィックスマッチング機能がありますが、一般的に効率的に機能するようには設計されていません。 FTSは語彙素性を見つけるために設計されています( '' blue''と '' blue''は一致しませんが、f.ex.' volvo'、 'volvos'と' volvo's')。 - 9.6にアップグレードすることができれば、 'pg_trgm'には素敵な新機能があります:単語の類似性。これはユースケースを処理する可能性があります。 – pozs

+0

9.6はまた、FTSの「フレーズ検索」(複数の隣接単語)のサポートを追加しました。 –

+0

また、別の解決策として、2つのステップで検索を行うことができます。まず、各単語のタイプミスを検索する必要があります( 'pg_trgm'が特に優れています)。一致を見つけたら、エンドユーザーに2番目のステップでそれらを検索することができます(同様に、単語のスペルミス時にGoogleがどのように処理するかをf.ex.と同様)。 – pozs

答えて

1

このような何かへの唯一のオプションはpg_trgmのcontribモジュールを使用することです。

これは、そのインデックスの全ての配列GINかのGiSTインデックスを作成することができます3文字の類似度演算子を使用して検索することができます。%

2つのノート:“偽陽性”結果を返すので、第二の条件を追加してくださいかもしれ%演算子を使用して

  1. (例えば、 LIKE)を使用しています。

  2. トリグラム検索は、長い検索文字列ではうまく機能しますが、誤った結果が多いため短い検索文字列ではうまく機能しません。

これが十分でない場合は、サードパーティのソリューションに頼らざるを得ません。

+0

これらの例では、1つの列で1語しか検索しないことがほとんどです。複数の列で複数の単語を検索するにはどうすればよいですか? –

+0

連結列( 'col1 || '' || col2% 'searchstring'')に単一の'% '演算子を使用するか、' AND'( 'col1%' searchstring 'AND col2% '検索文字列')。 –