0

我在 pg_search 的 google 组上发布了这个查询:

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])

我在某些列上只有常规的 btree 索引,例如 :name 。我没有 gin 或 gist 索引。我的问题是:我应该明确创建这些索引吗?如果是,那么哪种类型和哪些列?你能给我创建这些索引的语法吗?

4

1 回答 1

0

关于是否创建索引的问题不是通过查看 Ruby 代码就能知道的问题,也可能无法通过查看 db 模式知道。这些问题取决于查询的选择性、索引的数据量以及表的分页大小。这是因为 PostgreSQL 表支持物理顺序扫描,如果检索到表的很大一部分,这通常比索引驱动的查找更快。

GIN 和 GiST 索引将帮助您进行全文搜索,而 btree 并不是特别有用,但要使它们有用,您必须索引大量表并仅提取该表的一小部分。

我对此的偏好是等待有性能原因来创建索引,而不是在有疑问时预先创建。

编辑

最近在全文搜索方面的重度 GIN 经验使我改变了上面的建议。我现在认为,特别是对于全文索引,最好先创建 GIN 索引,然后在它干扰性能时将其删除。

请注意,GIN 的写入开销很大,因此它绝对不是免费的。但是,如果 fts 是您应用程序中的主要用例,FTS 索引几乎总是具有足够的选择性以发挥作用。

于 2013-04-04T12:44:39.387 回答