思考狮身人面像,寻找多个模型 [英] Thinking Sphinx and searching multiple models

查看:0
本文介绍了思考狮身人面像,寻找多个模型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在寻找一种方法来对多个模型执行搜索(请参阅this post),我得到了几个答案,认为Sphinx将非常适合这种情况。

确实,它看起来很不错,而且似乎应用程序范围的搜索功能(ThinkingSphinx.search)接近我想要的。但文档声明这将返回各种模型对象,具体取决于找到匹配项的位置。

我有一个模型,有点像这样:

  • 员工
  • 公司

员工仅通过公司链接到县,而公司又链接到市政当局,而市政府又链接到实际的县。

现在,由于我的搜索结果,我实际上只需要Employee对象。例如,搜索字符串"Joe Tulsa"应返回在命名模型中的某个位置同时存在这两个词的所有员工。我会得到一些假阳性,但至少我应该让塔尔萨县的每个员工都叫"乔"。

这是通过Think Sphinx的内置功能可以实现的吗?

推荐答案

我认为在这种情况下您应该为Employee模型定义关联(您可能已经这样做了),例如:

class Employee < ActiveRecord::Base
  ...
  belongs_to :company
  has_one :municipality, :through => :company
  has_one :county, :through => :company
  ...
end

class Company < ActiveRecord::Base
  ...
  belongs_to :municipality
  has_many :employees
  has_one :county, :through => :municipality
  ...
end

class Municipality < ActiveRecord::Base
  ...
  belongs_to :county
  has_many :companies
  ...
end

class County < ActiveRecord::Base
  ...
  has_many :municipalities
  ...
end

编辑:我测试了多级has_one关系,它不是这样工作的。在不去规格化的情况下对这4层进行建模似乎相当复杂。如果我有什么发现,我会更新的。在任何情况下,如果您取消规格化(即,将冗余的外部ID添加到Employees表中的所有模型),关联将非常简单,并且您将极大地增加索引生成时间。同时,它可能涉及更多工作以确保一致性。

一旦建立了关联,您就可以在Employee模型中定义Sphinx索引,如下所示:

define_index do
  indexes :name, :sortable => :true
  indexes company(:name),      :as => :company
  indexes municipality(:name), :as => :municipality
  indexes county(:name),       :as => :county
  ...
end

这样,您的关联中的列也会被索引,Sphinx将在构建索引时自动将所有这些表联接在一起。

这篇关于思考狮身人面像,寻找多个模型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆