2013-01-21 71 views
5

我正在postgres中實現全文搜索。應該在同一個表或外部表中存儲一個search_data tsvector嗎?

我想搜索我的系統中的所有帖子。帖子全文索引是帖子標題和帖子正文的合併。

我有實現這一目標的方式有兩種:

  1. 創造的職位表中的tsvector字段,觸發更新它。
  2. 使用包含索引數據的post_id和tsvector列創建第二個表(posts_search)。
  3. 創建一個簡單的杜松子酒指數...(出了問題,導致我的現實世界中的問題,需要數據在多個表中的索引)

這是怎麼回事有更好的表現,考慮到我有時需要篩選通過表格中的其他屬性(如deleted_at is null等)進行搜索。

將tsvector列保存在與數據相同的表中(side effect select * now sucks)還是單獨的表(副作用,需要連接,索引過濾很複雜)是一種更好的方法嗎?

回答

6

在我的實驗中,tsvector列的典型大小約爲文本字段大小的1%,此tsvector是使用to_tsvector()計算出來的。

考慮到這一點,將tsvector列存儲在另一個表中應該提供性能優勢。例如,即使你不使用SELECT *(你不應該,真的),原始單表中的任何seqscan仍然需要加載包含原始文本的頁面。如果將tsvector字段卸載到單獨的表格中,頁面加載速度將提高100倍。

換句話說,我贊成將tsvector字段卸載到單獨表的第二種解決方案。或者,也可以將帖子(原始文本)更加深入到表層次結構中(但我想它幾乎是一樣的)。

請注意,要使全文搜索起作用,原文不是必需的。你的方式甚至不想將它存儲在數據庫中,或者以高度壓縮的格式存儲它(不一定可以通過SQL例程輕鬆訪問)。只要某些東西可以基於原始文本創建tsvector,或者在更改時更新,它就會工作。

+0

雖然是索引重用,但不知道規劃師有多複雜,我不知道它是否可以 –

相關問題