Railsアプリケーションでの高速全文検索

遅かれ早かれ、各サイト(ソーシャルネットワーク、フォーラム、ブログ、その他の種類の情報ストレージ)の前で、検索の問題が発生します。 各開発者は独自の方法でこの問題を解決します。一部の開発者は独自のソリューションを作成し、他の開発者は既製の組み込み検索エンジンを使用し、他の開発者はGoogleのサービスなどの外部ソリューションを使用します。

この記事では、Ferretなどの検索ツールと、Railsアプリケーションでこのソリューションを使用するのがいかに簡単かについてお話したいと思います。


そのため、フェレットはApache Luceneに基づいた高性能の Ruby検索エンジンです。 フェレットのインストールは、1つのコマンドセットになります。

gem install ferret

Ferretは、Railsアプリケーションだけでなく、一般的なRuby用に設計されたエンジンです。 Railsで使用するのは想像以上に簡単です。 RailsとFerretを統合するには、プロジェクトにActs As Ferretプラグインをインストールする必要があります。 プロジェクトフォルダーに移動し、コマンドプロンプトで次のように入力します。

ruby script/plugin install svn://projects.jkraemer.net/acts_as_ferret/tags/stable/acts_as_ferret


Ferretを使用するには、次のことを行う必要があります:全文検索を実行するモデル(ユーザーまたは名前ではなく、ユーザーのインデックスを作成する場合)で、次の行を追加します。

class Member < ActiveRecord::Base
acts_as_ferret :fields => [:first_name, :last_name]
end


その後、フェレットはメンバーモデルテーブルにインデックスを付けます。 次に、検索の実行方法を検討します。

最も簡単な方法は、 find_id_by_contentsメソッドを使用することです。 したがって、次の命令を記述した場合:

total_results, members = Member.find_id_by_contents("Egor")

その後、次のことが起こります。

members = [
{:model => "Member", :id => "4", :score => "1.0"},
{:model => "Member", :id => "21", :score => "0.93211"},
{:model => "Member", :id => "27", :score => "0.32212"}
]

10件以上の結果を取得したい場合はどうすればよいですか? 答えは簡単です。find_id_by_contents関数には、その動作を制御できるいくつかのパラメーターがあります。


もちろん、 find_id_by_contents関数はブロックで使用できます。たとえば次のようになります。

results = []
total_results = Member.find_id_by_contents("Egor") {|result|
results.push result
}


または、識別子だけでなくデータベースからレコードを取得する場合は、次のようにします。

results = []
total_results = Member.find_id_by_contents("Egor") {|result|
results.push Member.find(result[:id])
}


後者の問題を解決するには、より簡単な方法があります: find_by_contents関数を使用します。

@results = Member.find_by_contents("Egor")

それで、この命令は何をしますか?


お気づきかもしれませんが、Ferretの使用は非常にシンプルで便利であると同時に、RubyおよびRuby On Railsのイデオロギーに明確に適合するため、このツールはプロジェクトで検索を整理するために不可欠なツールになります。

次のようなフェレットに関連するタスクについて学ぶためのPs


このマニュアルの詳細(この記事を書くために積極的に使用しました)とプロジェクトの公式Webサイトを参照することをお勧めします

Source: https://habr.com/ru/post/J48584/


All Articles