Postgres 9.1で全文検索を実行したいドキュメントのコレクションがあるので、それらをtsvectorのコンテンツとして追加し、この列にGINインデックスを作成するのは簡単に思えます。GINインデックスについての私の理解は、使用されるキーは(使用されるテキスト検索構成に応じて)元の単語のリストまたは元のドキュメントのコレクションからの正規化された語彙素のいずれかであるということです。ただし、私たちが開発した他の機能については、GINインデックスからキーのリストを取得して、使用するために別のテーブルの別の列に配置したいと思います。これは可能ですか?
1 に答える
次のように、ドキュメントに従って式インデックスを作成したと仮定しています。
CREATE INDEX pgweb_idx ON pgweb USING gin(to_tsvector('english', body));
もしそうなら、私が知る限り、次のようにインデックスから値を直接抽出することはできません:
SELECT to_tsvector('english', body) FROM pgweb;
で強制(テストのみ)してもインデックスを使用できないようですset enable_seqscan = off
。これは、PostgreSQL 9.2 のインデックスのみのスキャンで機能する可能性があります。まだマシンをアップグレードしていないので、なんとも言えません。
JOIN
ただし、インデックス付きのデータを含むテーブルで同じ式インデックスを使用することにより、インデックスを使用して他のクエリを高速化できる場合があります。
を別の目的で使用する場合はtsvector
、アプローチを変更することをお勧めします。タイプの新しい列をテーブルに追加tsvector
します。BEFORE INSERT OR UPDATE OR DELETE ... FOR EACH ROW
トリガーを使用してtsvector
、インデックスが作成された列で列を自動的に最新の状態に保ちます。次に、新しい tsvector 列に GIN インデックスを作成します。そうすれば、式のインデックスとしてのみ使用するのではなく、列を直接クエリできます。上記で既にリンクした「インデックスの作成」セクションをさらに読むと、これを行う方法と、トリガーを使用して tsvector 列を自動的に更新する方法の説明が表示されます。