2010-08-02 2 views
1

저는 레일 애플리케이션에서 검색을 강화하기 위해 Thinking Sphinx을 사용하고 있습니다.Rails ActiveRecord 메서드를 스핑크스 검색에 포함합니다.

나는 가이드가 명시 적으로 그 you can't index model methods을 말하고 있지만, 나는 알고 싶다. 구체적으로 말하면 acts_as_taggable_on_steroids을 통해 has_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 

이 검색이 잘 작동하는 것 같다, 하지만 사용자가 상속 된 태그를 사용하여 검색 할 수 있도록하기 위해 이들을 결합하는 데 문제가 있습니다. 어떤 조언을 많이 주시면 감사하겠습니다!

+0

:

뭔가를 시도? –

+0

스핑크스가 스핑크스와 통합하기위한 레일즈 플러그인이라고 생각하는 스핑크스 질문입니다. –

답변

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

나는이 상황에 대한 평가, James에 동의합니다. 실용적인 솔루션은 성능면에서 약간 더 복잡 할 것입니다 (예 : 솔루션에서 루트 카테고리의 태그를 추가하면 조상의 캐시 태그가 업데이트되지 않으며 이러한 버블 링을 도입하면 루트 카테고리의 태그를 오히려 천천히). 나는 아마도 생각 스핑크스 인덱스를 업데이트하는 레이크 작업을 편집하여 전체 캐시 된 태그를 계산할 수도 있고, 속도를 높이기 위해 일부 원시 SQL 문자열 조작을 넣을 수도 있습니다. 당신의 일에 감사드립니다! –