1

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

これは私が持っているモデルです:

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を追加しました。

フォローしているユーザーでフィルタリングして、タイヤのある会場を検索するにはどうすればよいですか?

4

2 に答える 2

1

自分の質問への回答を投稿します。

そのため、会場を検索するのは非常に簡単です。スタンダードVenue.tire.search {...}会場をフォローするユーザーでどうフィルタリングするかが問題。Venue モデルを検索に使用する代わりに、ブックマークにインデックスを付けることにしました。

これは私のブックマークモデルです

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

この後、インデックスに user_id と会場名があります。検索は次のように簡単になります。

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 を会場インデックスに配置することで提案されたものと比較してどうですか?

于 2012-01-26T16:22:04.253 に答える
0

会場ごとにドキュメントを作成してから、後続のすべてのユーザーIDの配列を含むフィールドを追加します。

これがelasticsearchの適切なタスクであると本当に確信していますか?

インデックスで会場の名前を検索してから、リレーショナルデータベースで必要なデータを検索する方がはるかに簡単だと思います。

于 2012-01-26T15:16:36.423 に答える