2013-01-02 2 views
0

패싯이 첨부 된 ElasticSearch/Tire 쿼리가 있습니다. 패싯은 쿼리 범위와 필터 대신 글로벌 범위를 사용하는 것으로 보입니다.ElasticSearch/Tire - 패싯이 쿼리로 필터링되지 않습니까?

내 정의입니다. 필터를 사용하는 범위를 정하는 방법을 모르겠습니다.

def self.facets_for(keyword_array, fasit, opts = {}) 
    keyword_array = [keyword_array] if keyword_array.is_a?(String) 
    tire.search(per_page: opts[:per_page], page: opts[:page]) do 
     query do 
     boolean { should { string '*' }} 
     end 
     filter :terms, :keyword => keyword_array 

     facet "phrases" do terms :phrases, :size => 20 end if fasit.include?("phrases") 
     facet "sentiment" do terms :sentiment end if fasit.include?("sentiment") 
     facet "lang" do terms :lang end if fasit.include?("lang") 
     facet "provider" do terms :provider end if fasit.include?("provider") 

    end # tire search 
    end 

는 지금,이 범위에서 "글로벌"입니다 측면을, 즉 (더 복잡한 쿼리가있는 경우 또는 쿼리)들이 필터에 의해 필터링되지 않습니다 반환합니다.

무엇이 누락 되었습니까?

답변

4

패싯 은 기본적으로 을 참조하여 발행 된 쿼리에 의해 바인딩 (제한됨)되어 있습니다.입니다.

필터를 반대로 수행하면 이 아닌은 패싯을 제한하여 "패싯 탐색"이 가능합니다 (다시 integration test case 참조).

예제에서 쿼리는 실질적으로 match_all 쿼리이므로 패싯을 제한 할 수 없습니다.

사물의 루비 측면에서

, keyword_array에 대한 안전한 구조는 다음과 같습니다

keyword_array = Array(keyword_array)