この記事では、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")
その後、次のことが起こります。
- インデックス/開発/メンバーフォルダが作成され、そこにインデックスが配置されます
- 参加者が追加、削除、または更新されるたびに、インデックスが更新されます(開発者からの追加の指示なし)。 何らかの理由ですべてのインデックスを強制的に更新する必要がある場合は、 インデックス/開発/メンバーフォルダを削除するだけで、インデックスは強制的に更新されます
- ActAsFerretはSearch_Each関数を呼び出します
- 関数の結果として、見つかったレコードの総数と、それらの最初の10個が次の形式で返されます
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関数には、その動作を制御できるいくつかのパラメーターがあります。
- offset-結果が返される位置を示します
- limit-返されるレコードの数
もちろん、 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")
それで、この命令は何をしますか?
- find_id_by_contents関数を呼び出して識別子を取得します
- 見つかった識別子によってデータベースから結果を取得します
- クラスActsAsFerret :: SearchResultsのオブジェクトを返します。これは、本質的にActiveRecord要素の配列に対する小さなアドオンです
お気づきかもしれませんが、Ferretの使用は非常にシンプルで便利であると同時に、RubyおよびRuby On Railsのイデオロギーに明確に適合するため、このツールはプロジェクトで検索を整理するために不可欠なツールになります。
次のようなフェレットに関連するタスクについて学ぶためのPs :
- 検索結果のページネーション
- 高度な検索
- カスタムフィールドのインデックス付け
- 結果の調整
- 検索結果の強調表示
- モデルフィールドごとに異なる重みを設定する
このマニュアルの詳細(この記事を書くために積極的に使用しました)とプロジェクトの公式Webサイトを参照することをお勧めします