2011-05-09 2 views
2

나는 sunspot을 사용하고 있습니다. LIKE 쿼리 (LIKE %q%)를 실행하려면 어떻게해야합니까? 나는 같은 것을 할 싶습니다 :Sunspot`LIKE` 쿼리

@search = Sunspot.search(User) do |q| 
    q.text_fields { with(:company_name).like(params[:q]) } 
end.results 

대신 : 부분적으로 나를 위해 작동

@search = Sunspot.search(User) do |q| 
    q.text_fields { with(:company_name).starting_with(params[:q]) } 
end.results 

합니다. 나는를 만드는 방법, 경우

Sunspot.search(User) do |q| 
    q.text_fields { with(:company_name).starting_with("sta")} } 
end 

=> Sunspot::Search:{:q=>"*:*", :fq=>["type:User", "company_name_text:sta*"]} 

LIKE %query%을 구현하는 더 간단한 방법이 없다 :

class StartingWith < Base 
    private 

    def to_solr_conditional 
    "#{solr_value(@value)}*" 
    end 
end 

그것은 기본적으로 다음과 같은 태양 흑점 검색 해시를 생성하십시오 sunspot 코드 검토, 나는이 코드 조각을 발견 SOLR 로직을 생성하는 to_solr_conditional 메서드를 사용하는 새로운 클래스 Like?

+0

'부분적으로 나를 위해 일하는'은 무엇을 의미합니까? :) 사실, 문제는 검색이 작동하지 않거나 메서드 별칭을 원한다는 것입니다. –

+0

또한 '더 단순한 방법'으로 무엇을 의미합니까? .starting_with ('sta')보다 더 간단 할 수있는 것은 무엇입니까? –

+0

안녕하세요 블라드, 답변 주셔서 감사합니다. 다음 요점에서 왜 부분적으로 저에게 도움이되는지 설명 드리겠습니다. 고마워요, https://gist.github.com/8257e7c4e512aa8a45df! – jpemberthy

답변

3

표준 DisMax 처리기를 사용하는 경우 와일드 카드를 지원하지 않습니다. 다음 두 가지 옵션이 있습니다.

a. EdgeNGramFilter 활성화 :

<fieldType name="text" class="solr.TextField" omitNorms="false"> 
    <analyzer type="index"> 
    .. 
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/> 
    .. 
    </analyzer> 
</fieldType> 

b. 야간 빌드 Solr을 EDismax Handler과 함께 사용하십시오.

wiki article on sunspot docs 또는 similar question on SO을 참조하십시오.

+0

그래서 문제를 해결할 수 있었습니까? 이 응답이 도움이됩니까? –

+0

헤이 블라드, 당신이 벌써 대답했다는 것을 깨달았습니다, 고마워요. 그것을 확인 :). – jpemberthy

+0

그래, 'EdgeNGramFilter'가 트릭을합니다. 감사! – jpemberthy