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

これを正しく行うにはどうすればよいですか?

4

3 に答える 3

16
  filter :term, :private => false

トリックを行う必要があります。ファセットを使用して何かを実行するかどうかによっては、トップレベルではなく、フィルタリングされたクエリのフィルタリングを実行する方が効率的な場合があります。

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

ただし、結果は変わらないはずです。

フィルタを使用してこれを行うこともできますがbool、実際に試した方法とは異なります。ブールフィルタ内で、オプションとそうでないものを示す構造を構築する必要があります。

例えば

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(複数のフィルタを指定した場合、タイヤが舞台裏で行うことです)が、明らかに柔軟性が高くなります。

于 2012-08-25T05:05:00.900 に答える
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
于 2012-08-25T04:50:34.453 に答える
3

Elasticsearch-ガイドによると、ブール値はTまたはFとして格納されるため、TまたはFでフィルタリングしてみます。

例えば

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

私は実際にタイヤを使用していません。これはガイドと例の調査に基づいています。

于 2012-08-25T04:50:19.923 に答える