2012-05-03 8 views
5

मेरे पास कई मॉडल elasticsearch साथ अनुक्रमित और उनमें से एक एक संघ फ़िल्टर किया जा करने की जरूरत है कि है, लेकिन अगर मैं search विधिफ़िल्टर रेल में टायर और ElasticSearch साथ केवल एक ही मॉडल के लिए आवेदन

search.filter :range, 'sessions.starts_on' => {:gte => start_date, 
               :lte => ends_on} 
में कुछ इस तरह जोड़ने

तो सभी मॉडल फ़िल्टर किए गए हैं क्योंकि उनके पास ऐसी कोई संस्था नहीं है sessions

तो क्या केवल एक मॉडल में फ़िल्टर लागू करने का कोई तरीका है?

किसी भी विचार की बहुत सराहना की जाती है!

+0

क्या आप AciveRecord का उपयोग कर रहे हैं? और क्या आपने इसके लिए to_json अनुक्रमणिका विधि को अनुकूलित करने पर विचार किया है? ActiveRecord के लिए – abhas

+0

हां। और सूचकांक अनुकूलित करना - वास्तव में कैसे? इन 'session.starts_on' को वापस करने के लिए क्या? – alony

उत्तर

1

टायर इंडेक्स के लिए विशेष रूप से उस मॉडल से संबंधित मॉड्यूल बनाएं और इसे मॉडल में शामिल करें। चूंकि सत्र मॉडल के साथ ही सहयोग है, इसका संदर्भ उस दस्तावेज़ में होगा जो लोचदार खोज में जा रहा है। आप सत्र दस्तावेज़ मर्ज करने के लिए इस तरह अपने मॉडल दस्तावेज़ में के रूप में हम टायर सूचकांक मॉड्यूल में elasticsearch को दस्तावेज़ के json पारित कर दिया है

def to_model_json 
    self.document.merge({"sessions" => sessions.as_json}).to_json 
end 

इस विधि टायर जो होने दिया जाएगा के माध्यम से elasticsearch को json में कोई दस्तावेज़ गुजर रहा है उनके दस्तावेज़ में विलय सत्र।

टायर सूचकांक मॉड्यूल में एक सूचकांक नाम जिसमें आप फ़िल्टर को चलाने के लिए टायर खोज वस्तु में पारित कर सकते हैं देने के प्रश्नों

अब एक टायर खोज वस्तु

search_object = Tire::Search::Search::new(Model.index_name, other attributes) 

बनाते हैं तो आप अन्य विशेषताओं की जांच कर सकते हैं जो https://github.com/karmi/tire

से पारित तो इस तरह से अपनी खोज विधि चला सकते हैं यह वांछित परिणाम

search_object.filter :range, 'sessions.starts_on' => {:gte => start_date, 
                :lte => ends_on} 
0 दे देंगे
संबंधित मुद्दे