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
Как это сделать правильно?
Ответы
Ответ 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.