2016-12-19 7 views
0

私のレールプロジェクトでpg_searchを使い始めましたが、私はインデックスを構築することについて混乱しています。RailsとPostgresql、インデックスの構築について混乱しました

私はフルテキスト検索を行う2つの属性を持つモデルを持っています:タイトルと説明。現在、私はこのセットアップを持っています:

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 

ただし、このコード行では2つの列tsv_bodyとtsvectorを追加していませんか?または、tsv_bodyはプレースホルダです(たとえば、私の場合の説明やタイトルなど)。その後

  • 、インデックスは次のようtsv_bodyするために添加されるべきである:

    ADD_INDEX(:記事、:tsv_body、使用: 'ジン')を

  • このガイドでは、トリガーについて説明します。トリガーが必要な理由文字列属性にインデックスを追加すると、トリガーは必要ありません(私が間違っていない場合)。

    1. トリガー自体には、「pg_catalog.english」があります。

    CREATE_TRIGGER(互換性:1).on(:記事).before(:挿入:更新は):= to_tsvector( 'pg_catalog.english'、合体(new.body、」 」new.tsv_bodyを行います'))); " end

    私の属性には英語だけでなく多くの言語があるので、複数の言語がある場合はインデックスを追加することも可能ですか? tsv_bodyとのtsvector:;

    答えて

    0

    0)あなたは、別の質問のように別の質問をする必要があります)

    1)add_column :posts, :tsv_body, :tsvector

    は、この2つの列を追加するコードの行はないですか?

    いいえ - add_columnには、単一の列を追加するための引数がいくつかあります。最初の引数はなぜトリガーが必要とされている)第二は、新たな列の名前であり、第三のカラムのタイプ(例えば、文字列、整数、またはこの場合tsvectorに)

    2であり、テーブル名であります?

    トリガーは、データベースで何か起こるかどうかを監視し、それに基づいて何かを実行するものです。この場合、あなたのトリガーはおそらくあなたの列の1つが変更されるのを見るために見ているような何かをしているでしょう...変更を加えてインデックスを更新します。これは、定期的にテーブル全体の再構築インデックスを実行するよりも優れています。これは潜在的に膨大で、時間がかかり、実行しなかったものを「更新」します。実際に変わる。

    3)複数の言語がある場合は、インデックスを追加することも可能ですか?

    はい。私は細部に詳しくは分かりませんが、索引の言語名を追加するという事実は、他の言語の索引も持つことができるということを示しています。

    関連する問題