タスク: PostgreSQL の複数のテーブルに全文検索を実装します。
たとえば、プロジェクトのテーブル - プロジェクト: 検索する必要がある 2 つのフィールドがあります: タイトルと説明です。このテーブルにインデックスを作成します。
ALTER TABLE public.projects ADD COLUMN search_fts tsvector;
UPDATE public.projects SET search_fts =
to_tsvector(
coalesce(title, '') ||' '||
coalesce(description, '') || ' '
);
CREATE INDEX in_projects_idx ON public.projects
USING gin (search_fts);
検索が簡単になりました:
SELECT
DISTINCT p.id,
p.title,
ts_rank(
p.search_fts,
to_tsquery('word1 | word2')
) as rank
FROM
projects p
WHERE
p.search_fts @@ to_tsquery('word1 | word2')
ORDER BY rank DESC;
洗練。ここで、テーブルとプロジェクト カテゴリ (project_categories) を確認する必要があります。tsvector の作成とフィールド名のテーブルの場合と同様です。検索クエリは次のとおりです。
SELECT
DISTINCT p.id,
p.title,
category.name as categoryName,
ts_rank(
(
coalesce(p.search_fts, '') ||' '||
coalesce(category.search_fts, '')
),
to_tsquery('word1 | word2 | categoryName')
) as rank
FROM
projects p
LEFT JOIN project_categories category
ON p.category_id = category.category_id
WHERE
(
coalesce(p.search_fts, '') ||' '||
coalesce(category.search_fts, '')
) @@ to_tsquery('word1 | word2 | categoryName')
ORDER BY rank DESC;
より洗練された。現在、プロジェクトに関連する数十のテーブルを 1 対多および多対多で検索する必要があります。
数字の結合が増えています。ますます多くのフィールドに結合します。
実際、質問は正しい方法ですか?この問題をどのように解決しますか?
ビュー付きのバージョンも考えています。たとえば、次のようなリクエストに基づいて構築されています。
(
SELECT
p.id as project_id,
p.search_fts
FROM projects p
) UNION ALL (
SELECT
p.id as project_id,
category.search_fts
FROM projects p
JOIN project_categories category
ON p.category_id = category.category_id
)
最後に、全体のインデックスを取得します。検索する基準。しかし、ビューでは、さまざまな通信オプションに対する多数の要求を組み合わせる必要があります。このオプションに関するあなたの意見に興味があります。
私の英語でごめんなさい。