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索引几乎总是具有足够的选择性。