2010-08-02 34 views
1

我使用Thinking Sphinx來爲我的Rails應用程序搜索。在Sphinx搜索中包含Rails ActiveRecord方法

我知道指南明確說you can't index model methods,但我想。具體來說,我有一個模型,其實例可以通過has_many_through關係通過acts_as_taggable_on_steroids進行標記。重要的警告:模型也嵌套通過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 

此搜索似乎工作就好了,但我無法將它們結合起來以允許用戶使用繼承標籤進行搜索。任何意見非常感謝!

+0

如果你的問題是不相關的獅身人面像,搜索引擎,你可以請刪除獅身人面像標籤? – 2010-08-02 19:33:22

+0

這是一個獅身人面像問題 - 思考獅身人面像是一個軌道插件與獅身人面像整合 – 2010-08-03 00:03:55

回答

2

獅身人面像只能索引數據庫中的數據,這是沒有辦法的(有一個XML選項,但思維獅身人面像不支持它)。

最好的辦法是向您的模型添加一個緩存的屬性,這對用戶是不可見的,但用於搜索。

試着這麼做:

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 
+0

我同意這種評估情況,詹姆斯。出於性能考慮,實際的解決方案必然會稍微複雜一些(例如,在您的解決方案中,在根類別中添加標籤不會爲祖先更新緩存標籤,並且引入這種冒泡會導致根類別的編輯標籤相當慢)。我可能要麼編輯更新思維獅身人面像索引以計算整個板上緩存標籤的rake任務,要麼我會放入一些本機SQL字符串操作來加速它。感謝您的工作! – 2010-08-03 13:12:54