2012-08-23 14 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フィルタは複数のフィルタを指定した場合、どのようなタイヤが舞台裏で使用されるのかよりも遅いですが、明らかに柔軟性があります。

3

elasticsearch - guideによれば、ブール値はTまたはFとして記憶されているので、私は、例えばTまたはF

によって

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

Iは実際に使用していないタイヤをフィルタリングしようと、これはちょうどそのガイドと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 
関連する問題