11

我想过滤我班级的私有布尔值,因此它只显示非私有但对我不起作用的资源。(我大大简化了代码)

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

我该如何正确地做到这一点?

4

3 回答 3

16
  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

bool过滤器比使用过滤器慢(and如果您指定多个过滤器,这就是轮胎在幕后所做的事情),但显然会给您更多的灵活性。

于 2012-08-25T05:05:00.900 回答
4

你可以试试:

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
于 2012-08-25T04:50:34.453 回答
3

根据elasticsearch-guide,布尔值存储为 T 或 F,所以我会尝试按 T 或 F 过滤。

例如

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

我实际上并没有使用过轮胎,这只是基于对指南和示例的一些研究。

于 2012-08-25T04:50:19.923 回答