Rails アプリケーションに検索機能を実装できる多くの gem について聞いたことがあるかもしれません。例: searchkick、elasticsearch-rails、ransack、そして最後に、solr 検索エンジンと連携する sunspot。これらすべての宝石にはそれぞれ独自の利点があります。 searchkick と elasticsearch はどちらも redis を使用してデータを検索し、新しいデータを挿入するときに「再インデックス」を実行する必要があります。最近のプロジェクトの 1 つで、たまたま Textacular と呼ばれる gem を使用しました。シンプルでとても使いやすいです。
テキストの宝石:
これは、PostgreSQL データベースの全文検索機能を提供する宝石です。これは基本的に、activerecord によって実行される作業の範囲をかなり友好的な方法で拡張することに対応します。 Herokuでも同様に動作します。この gem は PostgreSQL でのみ動作します。これを操作するには、まず https://rubygems.org/gems/textacular から最新の textacular gem を取得し、gemfile に追加しましょう。gem 'textacular' バンドルのインストール
Textacular gem は、データを検索するための非常に多くの方法を提供します。したがって、すべてのモデルはこれらのメソッドを使用するためにアクセスできます。
基本検索 高度な検索 ファジー検索
使用法:
基本検索: 入力されたテキストに基づいて検索します。
User.basic_search('abc') # すべてのモデル列属性を検索します。
User.basic_search(姓: 'abc'、名: 'xyz')
高度な検索: ここでは、!、&、| などの postgres 構文を使用できます。 (そして、または、そうではありません) そして、要件に基づいてその他のいくつか。ユーザーの検索 DSL を Pg 構文に変換します。このためには、構文エラーを処理するために必要な例外が使用されるようにする必要があります。
User.advanced_search(last_name: 'text1|text2') - User モデルの last_name の text1 または text2 で検索します。
User.advanced_search(last_name: '!text2') - last_name が text2 ではないレコードを検索します。
これらの検索は、以下に示すように連鎖させることができます。
User.advanced_search(last_name: 'text1|text2').basic_search(last_name: 'abc', first_name: 'xyz')
ファジー検索:
fuzzy_search を使用するには、pg_trgm モジュールをインストールする必要があります。以下のコマンドを実行して、このモジュールをインストールします。 DB 内のテキストの部分的な出現を検索します。
rake textacular:create_trigram_migration rake db:移行
これで、fuzzy_search を使用する準備が整いました。
User.fuzzy_search('ローレム')
あいまい検索のデフォルトでは、コンテンツ全体に対して検索文字列の 30% が一致するレコードを検索します。以下のコマンドを使用して、このしきい値制限を設定できます。
ActiveRecord::Base.connection.execute("SELECT set_limit(0.6);")
したがって、検索テキストの 60% が元のコンテンツと一致することが期待されます。 OR 条件を使用して複数の列を検索できます。入力テキストをパラメータ 1 として含む列のハッシュを渡し、2 番目のパラメータを false として渡す必要があります。 2 番目のパラメータを省略した場合、または True の場合は AND となります。
User.fuzzy_search({first_name: 'user', last_name: 'test'}, false)
User.fuzzy_search(first_name: 'user', last_name: 'test') - AND 条件を取ります。
デフォルトでは、Textacular はすべてのテキスト列と文字列列を検索します。モデル内の searchable_columns メソッドをオーバーライドすることで、デフォルトの動作を変更できます。
def self.searchable_columns [:title, :body] 終了
モデル内の self.searchable_ language をオーバーライドして、適切な辞書設定を行うことができます。
def self.searchable_lang 'アラビア語' 終了
グローバル検索などについては gem 公式ドキュメントをご確認ください。