1

私はThinking Sphinxを使用して、Rails アプリケーションの検索を強化しています。

ガイドには、モデル メソッドにインデックスを付けることはできないと明示的に書かれていることは知っていますが、そうしたいと思います。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

この検索は問題なく機能しているようですが、ユーザーが継承されたタグを使用して検索できるようにそれらを組み合わせるのに問題があります。どんなアドバイスでも大歓迎です!

4

1 に答える 1

2

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
于 2010-08-03T00:00:49.820 に答える