2012-01-26 2 views
1

タイヤでクエリを書き直そうとしています。タイヤでSQLクエリを書き直します。

class User < ActiveRecord::Base 
    has_many :bookmarks, :dependent => :destroy 
    has_many :followed_venues, :through => :bookmarks, :source => :bookmarkable, :source_type => 'Venue' 
end 

ユーザーが会場に従うことができます:

これは私が持っているモデルです。そして、特定のユーザーが続いている会場を検索する必要があります。

これまでのところ私は、ActiveRecordのでそれを行ってきた:

@user.followed_venues.where(["venues.title LIKE ?", "%"+params[:q]+"%"]) 

これは明らかに理想的ではないので、私はタイヤに私のアプリにelasticsearchを追加しました。

タイヤを使用して会場を検索し、それに続くユーザーがフィルタリングする方法を教えてください。

答えて

1

私は自分自身の質問に答えるつもりです。

場所を検索するだけで簡単です。標準Venue.tire.search {...}問題は、会場をたどるユーザーによってフィルタリングする方法です。 Venueモデルを使って検索するのではなく、ブックマークにインデックスを付けることにしました。

これは、私は、インデックス内のuser_idと会場名を持つこの後

class Bookmark < ActiveRecord::Base 
    belongs_to :bookmarkable, :polymorphic => true 

    def to_indexed_json 
    { 
     :title => bookmarkable.display_name, 
     :user_id => user_id 
    }.to_json 
    end 
end 

私のブックマークモデルです。今度は検索が次のように簡単になります。

Bookmark.tire.search :load => {:include => 'bookmarkable'}, :page => page, :per_page => per_page do 
    query do 
    fuzzy :title => { :value => query.downcase, :min_similarity => 0.6, :prefix_length => 2} 
    end 
    filter :terms, {:bookmarkable_type => ["Venue"], :user_id => [user.id]} 
end 

これは完全な解決策ではありません。そして、私もfilter :termsを正しく使用していると思います。私が今戻ってきた結果は、実際にブックマークの配列です。しかし、実際の場所をロードするのは簡単ですし、フロントページのページネーションを改善するためにWillPaginateコレクションにラップすることもできます。

このソリューションに問題がありますか?どのようにそれはphoetが会場のインデックスにユーザーIDを入れて示唆したものと比較しますか?

+0

解決策の問題は、クエリで 'load'を使用してデータベースにアクセスしていることです。もちろんこれはelasticsearchインデックスだけを使用するほど速くはありません。 – tommasop

+0

はい、わかりました。しかし、私はARオブジェクトを必要とします。 – egze

+0

ファジーメソッドが存在しません。このコードはうまくいきません。 –

0

私は各会場ごとに文書を作成し、その後に続くすべてのユーザーIDの配列を含むフィールドを追加します。

本当に確かです、これはelasticsearchにとって適切な仕事ですか?

私は、会場名の索引を検索し、リレーショナルデータベースで必要なデータを検索するだけで簡単になると思います。

+0

私は、会場名にファジーマッチングをもたせたいので、それはelasticsearchの仕事だと思います。私はそれについてどうやって行くのか別のアプローチを試みています。会場を索引付けする代わりに、user_idを持つブックマークを索引付けし、会場名を索引に追加します。私は秒でソリューションを投稿するつもりです。 – egze

+0

@phoetはい、私はelasticsearchクエリ自体に 'filter'を使用することをお勧めします。これは、データベースクエリが非常に単純/高速であるためです。明らかに1つの欠点は、データベースとインデックスを同期させておく必要があるため、ユーザー間でレコードが混在しないことです。 – karmi

関連する問題