2012-08-23 18 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 फिल्टर के साथ ऐसा कर सकते हैं, लेकिन काफी नहीं है कि कैसे आप की कोशिश की है - एक 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 

bool फ़िल्टर and फ़िल्टर का उपयोग करने से धीमा है (यदि आप एकाधिक फ़िल्टर निर्दिष्ट करते हैं तो दृश्यों के पीछे टायर क्या करता है) लेकिन स्पष्ट रूप से आपको अधिक लचीलापन देता है।

3

elasticsearch - guide के अनुसार, बूलियन्स टी या एफ के रूप में जमा हो जाती है, तो मैं टी या एफ

से छानने की कोशिश करेगा उदाहरण के लिए

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 
संबंधित मुद्दे