【问题标题】:Rails and Postgresql, confused about building indexesRails 和 Postgresql,对构建索引感到困惑
【发布时间】:2016-12-19 18:59:25
【问题描述】:

我开始在我的 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.指南告诉我,在表格中添加一列“tsvector”。

add_column :posts, :tsv_body, :tsvector

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

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

    add_index(:posts, :tsv_body, using: 'gin')

然后,指南谈到触发器。为什么需要触发器?如果为字符串属性添加索引,则不需要触发器(如果我没记错的话)。

  1. 在触发器本身中,有“pg_catalog.english”。

create_trigger(兼容性: 1).on(:posts).before(:insert, :update) 做 “new.tsv_body := to_tsvector('pg_catalog.english', coalesce(new.body,''));” 结束

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

【问题讨论】:

    标签: ruby-on-rails postgresql


    【解决方案1】:

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

    1) add_column :posts, :tsv_body, :tsvector

    这行代码是不是增加了两列:tsv_body 和 tsvector?

    否 - add_column 有多个参数用于添加单个列。第一个参数是表名,第二个是新列的名称,第三个是列的类型(例如字符串,整数,或者在这种情况下tsvector

    2) 为什么需要触发器?

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-12-08
      • 2017-02-28
      • 1970-01-01
      • 2012-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多