【问题标题】:Thinking Sphinx and searching multiple models思考狮身人面像并搜索多个模型
【发布时间】:2011-08-12 10:59:39
【问题描述】:

我正在寻找一种针对多个模型执行搜索的方法(请参阅 this post),并得到了几个答案,说 Thinking Sphinx 非常适合这种事情。

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

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

  • 员工
  • 公司
  • 直辖市

员工仅通过公司与县相关联,而公司又与市相关联,而市又与实际县相关联。

现在作为我的搜索结果,我真的只想要 Employee 对象。例如,搜索字符串“joe tulsa”应该返回所有员工,其中两个词都可以在命名模型的某处找到。我会得到一些误报,但至少我应该让塔尔萨县的每个员工都被命名为“乔”。

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

【问题讨论】:

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


    【解决方案1】:

    我认为在这种情况下您应该做的是为您的 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),则关联很简单,并且您会大量增加索引生成时间。同时,它可能需要更多的工作来确保一致性。

    建立关联后,您可以在 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 会在构建索引时自动将所有这些表连接在一起。

    【讨论】:

    • 啊,亲爱的,我会检查一下。谢谢!我看到嵌套的 has_many 将在 Rails 3.1 中得到支持,顺便说一句。
    • 啊,我想我可以忍受对数据库进行非规范化,但如果你遇到过更清洁的解决方案,请告诉我。 :) Rails 仍然很容易确保一致性 - 我只是添加了一个 after_save 挂钩来更新值。
    • 值得注意的是,您可以钻取关联 - 因此,如果 Sphinx 是唯一原因,则无需添加 has_one :through - 在您的索引中,以下内容将起作用:@987654327 @.
    猜你喜欢
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多