【问题标题】:Including Rails ActiveRecord methods in Sphinx searches在 Sphinx 搜索中包含 Rails ActiveRecord 方法
【发布时间】:2010-08-02 19:22:15
【问题描述】:

我正在使用Thinking Sphinx 在我的 Rails 应用程序上进行搜索。

我知道指南明确表示you can't index model methods,但我愿意。具体来说,我有一个模型,其实例可以通过acts_as_taggable_on_steroidshas_many_through 关系进行标记。重要的警告:模型也通过awesome_nested_set 嵌套,我有通过嵌套继承的标签。

这是我搜索继承标签的方式:

def inherited_tags
  retval = []
  cat = self
  while (cat = cat.parent)
    retval += cat.tags
  end
  retval.uniq
end

我可以使用以下方式通过显式(非继承)标签进行搜索:

define_index do
  indexes title
  indexes tags(:name)
end

此搜索似乎工作得很好,但我无法将它们组合起来以允许用户也使用继承的标签进行搜索。非常感谢任何建议!

【问题讨论】:

  • 如果您的问题与搜索引擎 sphinx 无关,能否请您删除 sphinx 标签?
  • 这是一个 sphinx 问题——认为 sphinx 是一个用于与 sphinx 集成的 rails 插件

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


【解决方案1】:

Sphinx 只能索引数据库中的数据,没有办法解决这个问题(有一个 XML 选项,但认为 sphinx 不支持它)。

最好的办法是为模型添加一个缓存属性,该属性对用户不可见,但用于搜索。

尝试类似:

class Category < ActiveRecord::Base
   define_index do
     indexes title
     indexes cached_tags, :as => :tags
   end

   before_validate :cache_tags       

   def ancestors
     if self.parent
       self.parent.ancestors + [self.parent]
     else
       []
     end
   end

   def inherited_tags
     ancestors.map { |cat| cat.tags }.flatten.uniq
   end

   private

   def cache_tags
     self.cached_tags ||= inherited_tags.join(" ")
   end      
end

【讨论】:

  • 我同意这种对情况的评估,詹姆斯。出于性能考虑,实际的解决方案必然会稍微复杂一些(例如,在您的解决方案中,在根类别中添加标签不会更新祖先的缓存标签,并且引入此类冒泡会导致编辑根类别的标签比较慢)。我可能会编辑更新思维狮身人面像索引的 rake 任务以全面计算缓存的标签,或者我会放入一些本机 SQL 字符串操作来加速它。感谢您的工作!
猜你喜欢
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 2013-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-21
  • 1970-01-01
相关资源
最近更新 更多