2012-08-23 7 views
11

Ich möchte den privaten boolean meiner Klasse filtern, so dass es nur Ressourcen zeigt, die nicht privat sind, aber es funktioniert nicht für mich. (Ich dumpfer den Code ungeheuer)Elastische Suche/Reifen: Wie filtere ich ein boolesches Attribut?

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 

Wie mache ich das richtig?

Antwort

16
filter :term, :private => false 

den Trick tun sollten. Je nachdem, ob Sie mit Sachen wollen Facetten tun kann es effizienter sein, Ihre Filtern einer gefilterten Abfrage zu tun, anstatt auf der obersten Ebene, dh

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

Es sollte nicht die Ergebnisse, obwohl ändern.

Sie können dies auch mit einem bool Filter, aber nicht ganz, wie Sie versucht - in einem Bool-Filter benötigen Sie einen structure aufzubauen, die sagt, was optional ist und was nicht

Zum Beispiel

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 

Ein bool Filter ist langsamer als ein and Filter (was der Reifen hinter den Kulissen tut, wenn Sie mehrere Filter angeben), bietet Ihnen aber offensichtlich mehr Flexibilität.

3

Nach dem elasticsearch - guide, booleans werden als T oder F gespeichert, so würde ich versuchen, Filtern von T oder F.

Zum Beispiel

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

Ich habe nicht wirklich Altreifen, das ist nur basierend auf einigen Recherchen zum Leitfaden und in der examples.

4

können Sie versuchen:

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 
Verwandte Themen