Включение Rails ActiveRecord методов в поиски Sphinx - PullRequest
1 голос
/ 02 августа 2010

Я использую 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

Похоже, что этот поиск работает нормально, но у меня возникают проблемы с их объединением, чтобы пользователи также могли выполнять поиск с использованием унаследованных тегов. Любой совет очень ценится!

1 Ответ

2 голосов
/ 03 августа 2010

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
...