2011-08-11 30 views
1

サイト内で検索機能を作成しようとしていますが、ユーザーが複数の単語を検索して、さまざまなモデルに存在する条件に一致する部分文字列を検索できるようにします。複数の単語を複数のモデルで検索する

この例のために、のは、私は次のモデルを持っているとしましょう:

  • 従業員
  • 会社

郡は、複数の自治体があり、複数の従業員を持つ複数の企業があります。

Employee.firstname、Employee.lastname、Company.name、Municipality.name、およびCounty.nameの組み合わせに対して検索を検索できるようにするため、最終結果をEmployeeインスタンスにします。

たとえば、 "joe tulsa"という文字列を検索すると、前の文で指定したプロパティのどこかに両方の単語があるすべての従業員が返されます。私はいくつかの誤認を得るだろうが、少なくとも私はTulsa郡の "Joe"という名前のすべての従業員を取得する必要があります。

私はいくつかのアプローチを試しましたが、私は正しい道を辿るとは確信していません。私はこれを行うための素敵なRoR-ishの方法を探しています。そして、より多くのRoRの知恵を持った人が、適切なソリューションの概要を助けることを望んでいます。

を、私は、検索のこの種の非常に経験ないんだけど、RoRの外に、私は手動でwhere句を作成し、一緒にすべてのテーブルを結合するSQL文を作成したい:私は試してみました何


別々の検索語ごとに、異なる表をカバーする。おそらくビルダーを使用します。次に、クエリを実行して結果をループし、Employeeオブジェクトを手動でインスタンス化し、配列に追加します。 RoRの中でこの問題を解決するには

、私がしてきた:

1)私のプロジェクトでは従業員モデルに対応するが、私はテーブルの2以上に参加するために必要なときに私が捕まってしまった何で名前のスコープに手を染め"ステップ"離れて(市町村と郡)。

2)クエリを簡略化するために、すべてのテーブルを結合するビュー(「search_view」と呼ばれる)を作成しました。そして、私はこのテーブルでEmployee.find_by_sql()を使用すると思っていました。私はSQLを作成するビルダーを使用したいと思ったし、ARELが使用するものだったことを思えたので、私は何かやってみました:

view = Arel::Table.new(:search_view) 

をしかし、結果としてアリエル::表は、すべての列が含まれていませんので、私のクエリを構築することはできません。現時点では、私は動作しているクエリビルダを取得する方法がわからないため、ちょっと立ち往生しています。

+2

適切な宝石を使ってSphinxやSolrなどのカスタム検索エンジンを試しましたか? – Bohdan

+0

いいえ、私はそれらを試していません。私たちはテーブルの中で何千ものレコードトップを話しています。だから私はそれが過度のものかもしれないと思っていました。あなたはそれが行く方法だと思いますか? – rogerkk

+0

真実を伝えるために私はそれを一度も使っていない(多分誰かが賛否両論の回答を投稿したり、http://stackoverflow.com/questions/737275/pros-cons-of-full-text-search-engineをチェックするだろう-lucene-sphinx-postgresql-full-text-searc)しかし、もし私が同様の仕事を解決しなければならないなら、私は間違いなく1つを使うでしょう。 – Bohdan

答えて

3

このような目的で適切な検索エンジンを使用することを強く推奨します。私は同様の問題を抱えていました。「私は何千ものマニュアルやチュートリアルを読む必要があります。まあ、そうではありません。

考えているスフィンクスはRailsの宝石です。スフィンクスを組み込むのがとても簡単です。あなたは始めるために、すべてで多くの経験を持っている必要はありません。

http://freelancing-god.github.com/ts/en/

私は他の検索エンジンを試していないが、私はスフィンクスに非常に満足しています。私は1日以内に比較的複雑なリアルタイム検索を設定することができました。

+0

ありがとう、私は今思考のスフィンクスを探しています。私はまた、Thinking Sphinx(http://stackoverflow.com/questions/7039142/thinking-sphinx-and-searching-multiple-models)と私が解決しようとしている問題に特化した新しい質問を掲載しました。あなたの答えは、より良いものが来ない限り、少しでも受け入れられるとマークします。 :) – rogerkk