Elastic Search/Tire: How do I filter a boolean attribute?

elasticsearch, ruby, ruby-on-rails, ruby-on-rails-3, tire

Solution

  filter :term, :private => false

Should do the trick. Depending on whether you want to do stuff with facets it may be more efficient to do your filtering a filtered query rather than at the top level, ie

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

It shouldn't change the results though.

You can also do this with a `bool` filter, but not quite how you tried - within a bool filter you need to build up a structure that says what's optional and what's not

For example

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

A `bool` filter is slower than using an `and` filter (which is what tire does behind the scenes if you specify multiple filters) but obviously gives you more flexibility.

Problem

I want to filter the private boolean of my class so it only shows resources that aren't private but it's not working for me. (I dumbed down the code tremendously) ``` 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 ``` How do I do this correctly?

Original source