1

こんにちは、バージョン 9.2.2 を使用して postgres で全文検索を使用する方法を学習しようとしています。

Here is my database:
title : character varying(1024)
body  : text
body_title_tsv | tsvector

次に body_title_tsv を body フィールドと title フィールドから構成される ts_vector に定義し、null を処理するために合体させました。

UPDATE pg_rocks_post SET body_title_tsv = to_tsvector( coalesce(body,'') || coalesce (title,''));

「タイトル」や「本文」の更新を処理する TRIGGER の書き方を知りたいです。

このような構文と tsearch2 関数を使用してトリガーを作成できることはわかっています。

    CREATE TRIGGER body_title_tsv_trig BEFORE UPDATE OR INSERT on pg_rocks_post 
FOR EACH ROW EXECUTE PROCEDURE tsearch2(body_title_tsv , title);

タイトルの代わりに本文でも同じことができます。

私の質問は、2 つを組み合わせて body_title_tsv を更新する方法です。

または、UPDATE が発生したときに body_title_tsv の SQL を本質的に実行する独自の関数を作成する方法を学ぶ必要がありますか? .

この問題に対処するもう 1 つの方法は、INDEX を作成することです。しかし、Kory と Susan Douglas による PostgreSQL の本で、トリガーの書き方と tsearch2 を使用する例を読む方法を理解しようとしています。

編集:これを行うこの関数に出くわしました。「tsvector_update_trigger」関数です。tsearch2 を使用してこれを行う方法があるかどうかを知りたいと思っています。

create trigger body_title_tsv_trig BEFORE UPDATE OR INSERT on pg_rocks_post FOR EACH ROW EXECUTE PROCEDURE tsvector_update_trigger(body_title_tsv,'pg_catalog.english',title,body);
4

1 に答える 1

1

私はこれについて少し違ったやり方をします。テーブルに一貫した検索インターフェイスが必要なようです。これを行う最善の方法は、関数で設計することです。その後、関数の出力にインデックスを付けることができます。この関数はテーブルにヒットせず、タプル データのみを操作することに注意してください。これが、出力を安全にインデックス化できる理由です。

 CREATE OR REPLACE FUNCTION tsv(pg_rocks_post) RETURNS tsvector LANGUAGE SQL AS
 $$
 SELECT tsvector(coalesce($1.title, '') || ' ' || coalesce($1.body, ''));
 $$;

今私はできる:

 SELECT tsv(p) FROM pg_rocks_post p;

そしてそれはうまくいくでしょう。場合によってはより便利な次のフォームを使用することもできます。

 SELECT p.tsv FROM pg_rocks_post.p;

また

 SELECT * from pg_rocks_post p WHERE plainto_tsquery('fat cat') @@ p.tsv;

p.tsv は関数呼び出しとして tsv(p) に変換されるため、テーブル エイリアスを省略できないことに注意してください。これは、PostgreSQL の使用を容易にするオブジェクトのような優れたシンタックス シュガーです。

次のステップは、関数の出力にインデックスを付けることです。

  CREATE INDEX pg_rocks_post_tsv_idx ON pg_rocks_post(tsv(pg_rocks_post));

では行きましょう。トリガーは不要で、派生データのインデックスを取得できます。

于 2013-11-27T09:40:34.467 に答える