Подтвердить что ты не робот

Elastic Search/Tire: Как фильтровать логический атрибут?

Я хочу отфильтровать private boolean моего класса, поэтому он отображает только ресурсы, которые не являются частными, но он не работает для меня. (Я очень сильно опустил код)

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

Как это сделать правильно?

4b9b3361

Ответ 1

  filter :term, :private => false

Должен сделать трюк. В зависимости от того, хотите ли вы делать вещи с фасетками, может быть более эффективно выполнять фильтрацию отфильтрованного запроса, а не на верхнем уровне, то есть

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

Однако он не должен изменять результаты.

Вы также можете сделать это с помощью фильтра bool, но не совсем так, как вы пытались - в 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

A bool фильтр работает медленнее, чем при использовании фильтра and (это то, что шина делает за кулисами, если вы указываете несколько фильтров), но, очевидно, дает вам большую гибкость.

Ответ 2

Вы можете попробовать:

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

Ответ 3

В соответствии с elasticsearch - guide, булевы хранятся как T или F, поэтому я бы попытался фильтровать T или F.

Например

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

Я не использовал шины, это основано только на некоторых исследованиях в руководстве и в examples.