任務: 在PostgreSQL的多個表中實現全文搜索。在PostgreSQL中使用相關表進行全文搜索
例如,項目表 - 項目: 有兩個字段需要搜索:標題和說明。 在這個表上創建索引:
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;
更復雜。現在,搜索必須與許多與項目相關的表格成爲一對多和多對多的表格。
數字連接的增長。結合到越來越多的領域。
其實這個問題是我要去的正確方法?你會如何解決這個問題?
我也考慮版本與視圖。 例如,建立在這樣的要求:
(
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
)
最後,我們得到了整體指數。由哪個搜索。 但在視圖中必須結合對各種通信選項的十幾個請求。 對此選項的意見感興趣。
對不起,我的英語。
感謝您的回覆。 我也想過用觸發器編寫整體索引。 但是這個選項也看起來不太舒服,就像我提出的所有選項一樣。 我認爲,沒有外部搜索引擎,相當簡單的搜索最好的解決任務。我對postrgesql中的搜索工具非常滿意。只是想找到創建一個總體索引的最佳方式。 但是,因爲這是一個遺憾,因爲所有varinty不舒服( – ddmaster 2013-02-26 14:54:24
@ddmaster是的,我同意這將是很好的內置支持多表全文搜索。但沒有,雖然如此你的選擇是真的使用外部工具或維護帶觸發器的彙總表。我不確定多表全文搜索如何在Pg中工作... – 2013-02-27 00:06:40