Rails和Postgresql,对构建索引感到困惑

时间:2016-12-19 18:59:26

标签: ruby-on-rails postgresql

我开始在我的rails项目中使用pg_search,我对构建索引感到困惑。

我有一个带有两个属性的模型,我在那里进行全文搜索:标题和描述。目前,我有这个设置:

class Argumentation < ApplicationRecord
  include PgSearch
  pg_search_scope :searchfor, :against => [:title, :description]
end

这可行,但查询速度很慢。它需要更快,我的第一个想法是添加一个索引。

有一个专门用于构建全文搜索索引的网站:https://github.com/Casecommons/pg_search/wiki/Building-indexes

我想遵循指南,但有些事情让我感到困惑:

1.指南告诉我,添加一个专栏&#34; tsvector&#34;到桌子。

add_column :posts, :tsv_body, :tsvector

但是这行代码添加了两列:tsv_body和tsvector?或者tsv_body是占位符,例如我的情况下的描述或标题?

  1. 之后,索引应该像这样添加到tsv_body:

    add_index(:posts,:tsv_body,using:&#39; gin&#39;)

  2. 然后,指南讨论触发器。为什么需要触发器?如果您为字符串属性添加索引,则不需要触发器(如果我没有弄错的话)。

    1. 在触发器本身中,有&#34; pg_catalog.english&#34;。
    2. create_trigger(兼容性:1).on(:posts).before(:insert,:update)do   &#34; new.tsv_body:= to_tsvector(&#39; pg_catalog.english&#39;,coalesce(new.body,&#39;&#39;));&#34; 端

      由于我的属性中有许多语言,而不仅仅是英语,我想知道:如果有多种语言,甚至可以添加索引吗?

1 个答案:

答案 0 :(得分:1)

0)你应该将单独的问题作为单独的问题提出;)

1)add_column :posts, :tsv_body, :tsvector

  

这段代码不是添加两列:tsv_body和tsvector?

否 - add_column有几个用于添加单个列的参数。第一个参数是表名,第二个是新列的名称,第三个是列的类型(例如字符串,整数,或者在本例中为tsvector)< / p>

2)为什么需要触发器?

触发器可以监视数据库中发生的事情,然后根据它执行某些操作。在这种情况下,您的触发器可能会执行某些操作,例如观察您的某个列何时更改...然后它将继续并使用更改更新索引 - 这比定期运行rebuild-index over更好整个表格 - 这可能是巨大的,需要很长时间,并且会“更新”那些实际上没有变化的东西。

3)如果有多种语言,甚至可以添加索引吗?

是。我对这些细节并不是很熟悉 - 但是你为索引添加语言名称这一事实表明你也可以拥有其他语言的索引。