2012-08-23 43 views
11

Sınıfımın özel boolean'ını filtrelemek istiyorum, bu nedenle yalnızca gizli olmayan kaynakları gösterir, ancak benim için çalışmıyor. (Ben kod aşağı devirdi)Elastic Search/Tire: Bir boole özniteliğini nasıl filtrelerim?

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 

Bunu nasıl doğru yaparım?

cevap

16
filter :term, :private => false 

hile yapalım mı. Eğer yüzlere sahip şeyler yapmak istemenize bağlı olarak, sizin yani

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

oldukça üst düzeyde daha filtrelenmiş sorgu filtreleme Gerçi sonuç değişmemelidir yapmak daha verimli olabilir.

Ayrıca bool filtresi ile yapabilirsiniz, ama tamamen değil nasıl çalıştı - bool filtre içinde bir isteğe ne diyor structure ve ne kurmak gerekir Örneğin değil

var

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 filtresi, and filtresini kullanmaktan daha yavaştır (birden çok filtre belirlerseniz lastiğin arkasında ne yapar), ancak açıkça size daha fazla esneklik sağlar.

3

elasticsearch - guide göre, boolean T ya da F olarak depolanır, bu yüzden örneğin T veya F

tarafından

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

Aslında kullanılmaz lastikler filtreleme denemek, bu Sadece rehberde ve examples'da yapılan bazı araştırmalara dayanmaktadır.

4

Deneyebilirsin:

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 
İlgili konular