Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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?

like image 688
LearningRoR Avatar asked Aug 23 '12 01:08

LearningRoR


2 Answers

  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.

like image 152
Frederick Cheung Avatar answered Oct 14 '22 08:10

Frederick Cheung


You can try:

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
like image 45
Robin Avatar answered Oct 14 '22 09:10

Robin