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 数组的字段。

您真的确定这是弹性搜索的正确任务吗?

我想在索引中搜索场地名称然后在关系数据库中查找所需的数据会更容易。

于 2012-01-26T15:16:36.423 回答