2

任務: 在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 
) 

最後,我們得到了整體指數。由哪個搜索。 但在視圖中必須結合對各種通信選項的十幾個請求。 對此選項的意見感興趣。

對不起,我的英語。

回答

3

你有兩個選擇:

  • 使用觸發器上的所有輸入表,以保持它結合了文本行感興趣的所有記錄的彙總表。這適用於像customer這樣的簡單案例,該案例有一個或多個phone和一個或多個address條目,您可以使用簡單拼接和string_agg在彙總表中將其放入彙總搜索表中作爲|customername|customerid|phone1|phone2|phone3|...|address1|address2|...。但是,它的規模很小,以至於深度嵌套關係,並且可能導致一些鎖定和併發問題。

  • 使用外部搜索系統,如Apache Solr,旨在解決複雜的搜索問題。

+0

感謝您的回覆。 我也想過用觸發器編寫整體索引。 但是這個選項也看起來不太舒服,就像我提出的所有選項一樣。 我認爲,沒有外部搜索引擎,相當簡單的搜索最好的解決任務。我對postrgesql中的搜索工具非常滿意。只是想找到創建一個總體索引的最佳方式。 但是,因爲這是一個遺憾,因爲所有varinty不舒服( – ddmaster 2013-02-26 14:54:24

+0

@ddmaster是的,我同意這將是很好的內置支持多表全文搜索。但沒有,雖然如此你的選擇是真的使用外部工具或維護帶觸發器的彙總表。我不確定多表全文搜索如何在Pg中工作... – 2013-02-27 00:06:40