0

我已經張貼在這裏pg_search的谷歌組此查詢:全文搜索的Ruby on Rails應用程序

https://groups.google.com/forum/?fromgroups#!topic/casecommons-dev/3tbCthkDHg0

但沒有任何反應,所以我在這裏對StackOverflow上張貼。我的問題是:我應該在下列情況下使用pg_search gem創建GIN類型索引嗎?

我的搜索僅限於使用pg_search_scope在單個模型中進行搜索。

這裏是一個具體的例子:

class Scenario < ActiveRecord::Base 
    ... 
    include PgSearch 
    pg_search_scope :search, :against => [:name, :compute_ngls], 
    :using => { :tsearch => {:dictionary => "english"} } 


    def self.text_search(query) 
    if query.present? 
     search(sanitize(query)) 
    else 
     scoped 
    end 
    end 
    ... 
end 

到text_search方法的調用情況如下:

scenarios = scenarios.text_search(params[:sSearch]) 

我只對某些欄目,如常規B樹索引:命名,例如。我沒有杜松子酒或主要指標。我的問題是:我應該明確創建這些索引嗎?如果是,那麼哪一種和哪些列?你可以給我創建這些索引的語法嗎?

回答

0

關於是否創建索引的問題不是通過查看Ruby代碼可以知道的,也可能無法知道查看您的數據庫模式。問題取決於您的查詢的選擇性,索引的數據量以及表格的頁面大小。這是因爲PostgreSQL表支持物理順序掃描,如果檢索到表的重要部分,這些掃描通常比索引驅動的查找更快。

GIN和GiST索引可以幫助您進行全文搜索,而樹不是特別有用,但是對於它們來說非常有用,您必須對索引表的大小進行索引,並且只拉取表格的一小部分。

我最喜歡的是等待那裏有性能方面的原因來創建索引,而不是在有疑問時創建預先的索引。

編輯

最近重GIN expeirence全文檢索使得我扭轉上面我的意見。我現在認爲,特別是對於全文索引,你最好先創建GIN索引,然後如果幹擾性能則放棄它。

請注意,GIN有主要的寫入開銷,所以它絕對不是免費的。但是,如果fts是您的應用程序中的主要用例,那麼FTS索引幾乎總是具有足夠的選擇性。