2012-08-23 80 views
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 

我该如何正确执行此操作?

回答

16
filter :term, :private => false 

应该做的伎俩。根据您是否想要做的东西与面可能是更有效地做你的过滤过滤查询,而不是在最顶层,即

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

它不应该改变,虽然结果。

你也可以做到这一点与bool过滤器,但倒不怎么你试过 - 一个布尔值过滤器中,你需要建立一个structure,说什么是可选的,什么不是

例如

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过滤器要慢(如果您指定了多个过滤器,这是轮胎在幕后执行的操作),但显然会为您提供更大的灵活性。

3

按照elasticsearch - guide,布尔值被存储为T或F,所以我会尝试通过滤波T或F.

例如

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

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

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