2012-08-23 119 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