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

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

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

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


person LearningRoR    schedule 23.08.2012    source источник


Ответы (3)


  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 (это то, что покрышка делает за кулисами, если вы указываете несколько фильтров), но, очевидно, дает вам больше гибкости.

person Frederick Cheung    schedule 25.08.2012

Можешь попробовать:

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
person Robin    schedule 25.08.2012

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

Например

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

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

person kristianp    schedule 25.08.2012