2010-01-29 16 views
10

क्या "अंतर्निर्मित" क्वेरीज़ेट फ़िल्टर ऑपरेशंस के साथ एक Django Haystack खोज को जोड़ना संभव है, विशेष रूप से QQuery() उदाहरणों और खोज प्रकारों के साथ फ़िल्टरिंग SearchQuerySet द्वारा समर्थित नहीं है? या तो निम्न करें:फ़िल्टर Django Haystack QuerySet जैसे परिणाम?

haystack-searched -> queryset-filtered 

या

queryset-filtered -> haystack-searched 

Django Haystack प्रलेखन ब्राउज़िंग किसी भी दिशा-निर्देश कैसे यह करने के लिए नहीं दिया।

उत्तर

10

आप एक Haystack खोज के परिणामों के आधार पर अपने क्वेरीसमूह फ़िल्टर कर सकते हैं, वस्तुओं 'पीकेएस का उपयोग कर:

def view(request): 
    if request.GET.get('q'): 
    from haystack import ModelSearchForm 
    form = ModelSearchForm(request.GET, searchqueryset=None, load_all=True) 
    searchqueryset = form.search() 
    results = [ r.pk for r in searchqueryset ] 

    docs = Document.objects.filter(pk__in=results) 
    # do something with your plain old regular queryset 

    return render_to_response('results.html', {'documents': docs}); 
नहीं

यकीन है कि यह कैसे मापता है, लेकिन छोटे resultsets के लिए (कुछ सौ, मेरे मामले में) , यह ठीक काम करता है।

+6

इसके साथ, आपके परिणाम आईडी द्वारा क्रमबद्ध किए जाएंगे, और आप pertinence खो देंगे। – dzen

+0

@dzen प्रासंगिकता रैंक बनाए रखने के दौरान ऐसा करने का सबसे अच्छा तरीका क्या है? –

+5

यह स्केल नहीं करता है। मुझे लगता है कि क्वेरी बहुत लंबी हो जाती है - कुछ हज़ार आईडी के साथ 0 परिणाम होंगे। –

0

आप यथार्थता के साथ बनाए रखने के लिए चाहते हैं, तो आप "वस्तु" के माध्यम से डेटाबेस से वस्तु का उपयोग करने के लिए है:

अपने खाके में उदाहरण:

{% for result in results %} 
    {{ result.object.title }} 
    {{ result.objects.author }} 
{% endfor %} 

लेकिन इस के बाद से वास्तव में बुरा है हैयस्टैक प्रत्येक परिणाम पर "चयन * ब्लाह से आईडी = 42" जैसे अतिरिक्त अनुरोध करेगा।

लगता है कि आप उन ऑब्जेक्ट को अपने डेटाबेस से प्राप्त करने का प्रयास कर रहे हैं क्योंकि आपने अपने सूचकांक में कुछ अतिरिक्त फ़ील्ड नहीं लगाए हैं? आप अपने SearchIndex में शीर्षक और लेखक को जोड़ने, तो आप सिर्फ अपने परिणामों का प्रयोग कर सकते हैं:

{% for result in results %} 
    {{ result.title }} 
    {{ result.author }} 
{% endfor %} 

और कुछ अतिरिक्त प्रश्नों से बचें।

+1

यदि आप searchqueryset.load_all() चलाते हैं, तो ऑब्जेक्ट्स को एक समय में डेटाबेस के रूप में यथासंभव कुशलता से पहले से लोड किया जाएगा। – melinath

+0

"चयन * से ब्लॉ WHERE आईडी (12, 132,1251) जैसे कुछ के साथ" तो क्या यह कुशल है, एक नई सॉकेट खोलने के लिए, वहां से डेटा प्राप्त करें? – dzen

1

डॉक्स से:

SearchQuerySet.load_all (स्वयं)

कुशलतापूर्वक खोज परिणामों में वस्तुओं भरता है। इस विधि को का उपयोग किए बिना, डीबी लुकअप प्रति-ऑब्जेक्ट आधार पर किए जाते हैं, जिसके परिणामस्वरूप डेटाबेस के लिए कई व्यक्तिगत यात्राएं होती हैं। यदि load_all का उपयोग किया जाता है, तो SearchQuerySet समान वस्तुओं को एक ही क्वेरी में समूहित करेगा, जिसके परिणामस्वरूप कई ऑब्जेक्ट प्रकार लौटाए गए हैं।

http://django-haystack.readthedocs.org/en/latest/searchqueryset_api.html#load-all

इसलिए, आप फ़िल्टर किए गए SQS है के बाद, आप उस पर एक load_all() कर सकते हैं और सिर्फ SearchResult.object के माध्यम से डेटाबेस वस्तुओं का उपयोग। जैसे

sqs = SearchQuerySet() 
# filter as needed, then load_all 
sqs = sqs.load_all() 

for result in sqs: 
    my_obj = result.object 
    # my_obj is a your model object 
संबंधित मुद्दे