この回答に続いて、ランクで並べ替え、一致するクエリのみに制限する場合、PostgreSQL の組み込みの全文検索を使用する最良の方法を知りたいと思います。
非常に単純なテーブルを想定してみましょう。
CREATE TABLE pictures (
id SERIAL PRIMARY KEY,
title varchar(300),
...
)
または何でも。今、私はフィールドを検索したいと思いtitle
ます。まず、インデックスを作成します。
CREATE INDEX pictures_title ON pictures
USING gin(to_tsvector('english', title));
今、私は検索したい'small dog'
。これは機能します:
SELECT pictures.id,
ts_rank_cd(
to_tsvector('english', pictures.title), 'small dog'
) AS score
FROM pictures
ORDER BY score DESC
しかし、私が本当に欲しいのはこれです:
SELECT pictures.id,
ts_rank_cd(
to_tsvector('english', pictures.title), to_tsquery('small dog')
) AS score
FROM pictures
WHERE to_tsvector('english', pictures.title) @@ to_tsquery('small dog')
ORDER BY score DESC
または、これ(これは機能しません-句score
では使用できません):WHERE
SELECT pictures.id,
ts_rank_cd(
to_tsvector('english', pictures.title), to_tsquery('small dog')
) AS score
FROM pictures WHERE score > 0
ORDER BY score DESC
これを行う最善の方法は何ですか?私の質問は何倍もあります:
- バージョンを繰り返し使用する
to_tsvector(...)
と、それが 2 回呼び出されますか、それとも何らかの方法で結果をキャッシュするのに十分なほどスマートですか? to_ts...
関数呼び出しを繰り返さずにそれを行う方法はありますか?- 句で使用する方法は
score
まったくありますか?WHERE
- もしあれば、それでフィルタリングする
score > 0
か、それを使用する方が良いでしょ@@
うか?