2016-08-01 13 views
7

के साथ हैस्टैक परिणामों को फ़िल्टर करने के लिए कैसे करें मुझे अपने मॉडल में टेक्स्ट-सर्च करने और एक ही समय में डीबी क्वेरी के साथ फ़िल्टर करने की आवश्यकता है।डीबी क्वेरी

उदाहरण के लिए:

class MyModel(models.Model): 
    text = models.TextField() 
    users = models.ManyToMany(User) 

class MyModelIndexIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.CharField(document=True, model_attr='text') 

    def get_model(self): 
     return MyModel 

तो मैं उपयोगकर्ता द्वारा और पूर्ण-पाठ खोज के माध्यम से कुछ पाठ से सभी MyModel वस्तुओं फ़िल्टर करना चाहते हैं। इस तरह के Smth:

qs = MyModel.objects.filter(users=request.user) 
sqs = MyModelIndex.objects.filter(text=request.GET['q']) 
intersection = some_magic_function(qs, sqs) 

या

intersection = some_other_magic_function(
    qs_kwargs={'users': request.user}, 
    sqs_kwargs={'text': request.GET['q']} 
) 

बेशक वांछित डाटाबेस प्रश्नों और अधिक जटिल हो सकता है।

मैं बड़ी खामी के साथ कुछ संभव समाधान, सभी देखें: Django में

  1. मेक मिलन बिंदु: Q के आईडी निकालें और उन्हें SQS फिल्टर या ठीक इसके विपरीत में इस्तेमाल करते हैं। समस्या: प्रदर्शन। हम पेजिनेशन का उपयोग करके इस प्रकार काम कर सकते हैं और केवल दिए गए पेज और इसके पूर्ववर्तियों के लिए छेड़छाड़ कर सकते हैं। । इस मामले में हम कुल संख्या (

  2. सूचकांक सभी M2M संबंधित क्षेत्रों समस्या खोना: प्रदर्शन, कार्यक्षमता नकल (मैं db इस तरह के प्रश्नों ज्यादा बेहतर करना होगा विश्वास करते हैं), db-सुविधाओं जैसे टिप्पणियां आदि

  3. के रूप में भूसे के ढेर का उपयोग न करें (mysql के लिए जाएं या posgresql में निर्मित पूर्ण-पाठ खोज।

मेरा मानना ​​है कि मैं कुछ स्पष्ट याद आती है। मामला काफी आम हो रहा है। वहाँ एक पारंपरिक समाधान है?

+1

आपको अपने "चौराहे" चर में क्या डेटा होना चाहिए? क्या इसमें माईमोडेल के साथ-साथ MyModelIndex ऑब्जेक्ट्स शामिल होना चाहिए? या आप सिर्फ एक या दूसरे की जरूरत है? यदि आप समझ सकते हैं कि आप जो हासिल करने की कोशिश कर रहे हैं, वह मदद कर सकता है, तो इसका कोई संदर्भ नहीं है। –

+0

@TitusP: मेरे चौराहे में मैं या तो क्वेरीसेट या searchresultset चाहता हूँ। मेरे उदाहरण में मैं उपयोगकर्ता द्वारा और पूर्ण-पाठ खोज के माध्यम से सभी MyModel ऑब्जेक्ट्स को फ़िल्टर करके फ़िल्टर करना चाहता हूं। – Nik

+0

आप किस हेस्टैक इंजन का उपयोग करते हैं? –

उत्तर

1

में सामान्य मामला, यह केवल एक प्रश्न का उपयोग कर आपकी समस्या को हल करने के लिए संभवतः संभव नहीं है। उदाहरण के लिए, यदि आप एलएंडैगो मॉडल के लिए एक खोज बैकएंड इंजन और MySQL के रूप में लोचदार खोज का उपयोग कर रहे हैं, तो कोई भी तरीका नहीं है MySQL और ElasticSearch एक एकल, सामान्य क्वेरी बनाने के लिए संवाद करेगा।

हालांकि, यदि आप अपने Django मॉडल और आपके हेस्टैक बैकएंड इंजन के लिए एक सामान्य SQL डेटाबेस का उपयोग कर रहे हैं तो एक वर्कअराउंड होना चाहिए। आपको एक कस्टम हैस्टैक इंजन बनाना होगा जो क्वेरी को पार्स करेगा और उपलब्ध मॉडलों को फ़िल्टर करेगा।

उदाहरण के लिए, SimpleSearchBackend के व्यवहार को संशोधित करने के लिए, तुम सब करने की जरूरत है search विधि पैच है:

class CustomSimpleSearchBackend(haystack.backends.SimpleSearchBackend): 

    def search(self, query_string, **kwargs): 
     ... 
     if query_string: 
      for model in models: 
       ... 
       if 'users' in kwargs: 
        qs = qs.filter(users=kwargs['users']) 
       ... 

class CustomSimpleEngine(haystack.backends.BaseEngine): 
    backend = CustomSimpleSearchBackend 
    query = haystack.backends.simple_backend.SimpleSearchQuery 

और settings.py में:

HAYSTACK_CONNECTIONS = { 
    'default': { 
     'ENGINE': 'myapp.backends.CustomSimpleEngine', 
    }, 
} 

जो कनेक्शन पर निर्भर करता है बैकएंड आप उपयोग करते हैं, आवश्यक पैच निश्चित रूप से अलग होगा, लेकिन मुझे संदेह है कि इसे लागू करना बहुत कठिन नहीं होना चाहिए।

संबंधित मुद्दे