2012-08-23 2 views
11

내 클래스의 개인용 부울을 필터링하여 개인용이 아닌 리소스 만 보여주기 때문에 나에게 적합하지 않습니다. (나는 코드를 엄청나게 내려 봤다.)탄성 검색/타이어 : 부울 속성을 필터링하려면 어떻게해야합니까?

mapping do 
    indexes :private, type: "boolean" 
    indexes :name, type: "string" 
end 
end 

def self.search(params) 
    tire.search(load: true, page: params[:page], per_page: 20) do 
     query { string params[:query] } if params[:query].present? 
     # So far I've tried... 
     # filter :bool, :private => ["false"] 
     # filter :bool, private: false 
    end 
end 

어떻게 올바르게 처리 할 수 ​​있습니까?

답변

16
filter :term, :private => false 

트릭을 할해야합니다. 당신이 측면으로 물건을 할 것인지 여부에 따라 당신의 즉

tire.search(...) do 
    query do 
    filtered do 
     query { string, params[:query] } 
     filter :term, :private => false 
    end 
    end 
end 

, 오히려 최상위 레벨에보다 필터링 된 쿼리를 필터링 그것은 비록 결과를 변경하지 말아야 할 것이 더 효율적일 수있다.

당신은 또한 bool 필터를 사용하여이 작업을 수행 할 수 있지만, 확실히 방법이 시도 - 부울 필터 내에서 당신이 선택 무엇 말한다 structure 무엇을 구축 할 필요가 예를 들어하지

tire.search(load: true, page: params[:page], per_page: 20) do 
    query { string params[:query] } if params[:query].present 
    filter :bool, :must => {:term => {:private => true}} 
end 

bool 필터는 and 필터를 사용하는 것보다 느리며 (여러 개의 필터를 지정하면 뒤에서 타이어가 수행하는 것임) 분명히 유연성이 향상됩니다.

3

elasticsearch - guide에 따르면, 논리 값은 T 또는 F로 저장됩니다, 그래서 예를 들어 T 또는 F.

에 의해

filter :terms, :private => ['T'] 

실제로 사용하지 않은 타이어를 필터링을 시도 할 것입니다 단지 가이드 및 examples의 일부 연구를 기반으로합니다.

4

당신이 시도 할 수 :

tire.search(load: true, page: params[:page], per_page: 20) do 
    query do 
     boolean do 
      must { string params[:query] } if params[:query].present? 
      must { term :private, true } 
     end 
    end 
end