Rails 4.1 - Thinking-Sphinx通过关系与多对多搜索

时间:2014-07-23 20:29:21

标签: ruby-on-rails ruby sphinx thinking-sphinx

我正在创建一个包含三个模型对象的应用TeamUsersMemberMemberTeam和{{之间的联接表1}}。因此,每个Users可以有许多成员,每个Team可以是多个团队的成员。

这种关系看起来像这样:

User

我想要做的是搜索特定团队中的成员。目前我获得了# Team.rb has_many :members has_many :users, through: :members # User.rb has_many :members has_many :teams, through: :members 个结果。

我的索引如下所示:

no

我的# user_index ThinkingSphinx::Index.define :user, :with => :real_time do indexes name indexes email indexes about has team_id, type: :integer has created_at, type: :timestamp has updated_at, type: :timestamp indexes members.team.name, :as => :teams end # team_index ThinkingSphinx::Index.define :team, :with => :real_time do indexes name has created_at, type: :timestamp has updated_at, type: :timestamp indexes members.user.name, :as => :members end # member_index.rb ThinkingSphinx::Index.define :member, :with => :real_time do has user_id, type: :integer has team_id, type: :integer has created_at, type: :timestamp has updated_at, type: :timestamp end 索引操作(执行搜索的位置) - 看起来像这样:

members_controller

我已经检查过团队实际上有用户,但是@users总是返回0.有关如何使其按照我的意愿工作的任何想法?

更新

我使用Rails:4.1.4 思考 - 思考:3.1.1

我的Sphinx查询如下所示:

def index

  @team = Team.find_by_id(params[:team_id])
  @users = @team.users.search(params[:search], :page => params[:page], :per_page => 10)

end

Sphinx找到0结果

略微更新控制器代码:

Sphinx Query (0.7ms)  SELECT * FROM `member_core` WHERE MATCH('Anders') AND `team_id` = 2 AND `sphinx_deleted` = 0 LIMIT 0, 10

1 个答案:

答案 0 :(得分:1)

因此,此问题的原因是提供了搜索查询,但没有要匹配的字段。添加固定的字段,这很棒。

上述评论中提到的第二个问题是,当您搜索电子邮件地址时,会引发查询错误。这是因为@字符表示查询中的字段名称(限制搜索到特定字段 - 例如"@name Anders"以搜索名为name的字段中的Anders。)

你有两种解决方法...要么通过将查询包装在ThinkingSphinx::Query.escape(params[:query])中来逃避查询,要么你正在搜索特定的电子邮件地址,那么我建议改用ActiveRecord(给定您几乎肯定会对数据库中的电子邮件地址有唯一约束,因此应该只有零个或一个匹配记录)。后一种方法也意味着不需要将电子邮件作为索引字段,如果您让任何人通过参数定义您的搜索查询,这会更安全一些。让某人搜索' gmail'并且他们用gmail地址收回所有用户可能不是一个明智的想法。