2009-08-27 11 views
1

私のレールアプリケーションの1つに検索機能を追加しようとしています。私はちょうどかなりのいくつかのモデルのmysqlの列を検索する必要があります。私はこれを行う最善の方法が何であるか疑問に思っています。私はプラグインを使うべきだと思っていますが、本当に誰かに推薦する人はいません。あなたが他の人よりもお勧めする人はいますか? acts_as_ferretはどうですか?ありがとう。レールアプリケーションでのサイト全体の検索

答えて

1

Searchlogicはチェックアウトする価値があります。 ryanbさんはちょうどawesome railscastでした。フルテキストソリューションをお探しの場合は、screencast on Thinking Sphinxもあります。

+1

私はこれにSphinxを使用しています。それはかなりきれいです - 私はRiddleクライアント(thinking_sphinx男から)を使用するRubyコードの20行を持っています。 1つのキャッチがあります.Sphinxは、索引付けするそれぞれの事柄に固有の文書IDが必要です。私はsql_query_pre、sql_query_post、および@variableを使って、各ドキュメントが(私が完全に無視する)一意のIDを取得することを確認します。 – casey

+1

Searchlogicは素晴らしいですが、私はクロスモデル検索機能を提供しているとは思いません。 (私が間違っていると私を訂正してください!) スフィンクスとThinkingSphinxは確かに、私の意見では非常に効果的です。 – NeilS

1

私は決してacts_as_ferretを使用していません。ここにあなたができることがあります。そのような表を作成:あなたが検索したい各モデルの

create_table(:indexed_models) do |t| 
    t.column :name, :string 
    t.column :model_id, :id 
    t.column :index, :string 
end 

を、「インデックス」を作成するために、検索可能列の値を連結します。結果をindexed_modelsテーブルに挿入します。名前がモデルの名前である場合、model_idは主キーであり、indexは検索可能なコンテンツです。 「検索可能」と指定したモデルが変更された場合は、オブザーバーを使用してindexed_modelsテーブルを作成および更新します。

indexed_modelsのインデックスフィールドをテキスト検索し、リターンモデル名&プライマリキーに基づいてモデルのコンテナを生成します。

私はこのアプローチを使ったことが一度もありませんが、私もそれを意味しています。

+1

ちょっと考えてみましょう:もしあなたがそのルートを辿るなら、インデックス付きモデルと元のモデルの間に多相関係を使用することができます - ActiveRecordはインデックス付きモデルから元のあなたはあなた自身を転がす必要があります。 – NeilS

+0

@ニールズ良い点は、これらの検索可能なすべてのモデルにSTI(Single Table Inheritance)を使用することです。このようにして、create_tableの "name"列は必要ありません。既にモデルを持っている、あるいはこれらのモデルでSTIを動作させることができない場合は、もう少し作業が必要です。 –

1

検索デーモンとインデクサーとしてSphinxを強くお勧めします。それは本当に良い、カスタマイズ可能でスケーラブルです。クライアントとフロントエンドライブラリの使用UltraSphinxまたはThinkingSphinxとして

。最近、より良いサポートが2番目にあります。

+0

ThinkingSphinxはPDFなどのファイルを検索できますか? – Shanison

関連する問題