簡體   English   中英

使用Postgres和pg_search gem全文搜索Ruby on Rails應用

[英]Full text search for Ruby on Rails app using Postgres and pg_search gem

我已經在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。 我沒有杜松子酒或吉斯索引。 我的問題是:我應該明確創建這些索引嗎? 如果是,那么哪種類型,在哪些列上? 能否請您給我介紹創建這些索引的語法?

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

GIN和GiST索引將幫助您進行全文搜索,而btrees並不是特別有用,但要使它們有用,您必須對大量表進行索引並僅提取該表的一小部分。

我的首選是等待有性能原因來創建索引,而不是在有疑問時先創建索引。

編輯

最近對GIN的大量搜索以及對全文檢索的豐富經驗使我改變了上面的建議。 我現在認為,特別是對於全文索引,最好先創建GIN索引,然后再創建GIN索引(如果它影響性能的話),然后再刪除它。

請注意,GIN具有較大的寫開銷,因此它絕對不是免費的。 但是,如果fts是應用程序中的主要用例,則FTS索引幾乎總是具有足夠的選擇性,以很有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM