Django 2.1

Search




django

Search

हम प्रश्न बनाने में उपयोग किए जाने वाले समान मॉडलों का उल्लेख करेंगे।

बक्सों का इस्तेमाल करें

मानक पाठ संबंधी प्रश्न

पाठ-आधारित फ़ील्ड में सरल मिलान कार्यों का चयन होता है। उदाहरण के लिए, आप एक लेखक को देखने की अनुमति देना चाह सकते हैं जैसे:

>>> Author.objects.filter(name__contains='Terry')
[<Author: Terry Gilliam>, <Author: Terry Jones>]

यह एक बहुत ही नाजुक समाधान है क्योंकि इसके लिए उपयोगकर्ता को लेखक के नाम का सटीक विकल्प जानना आवश्यक है। एक बेहतर दृष्टिकोण एक केस-असंवेदनशील मैच हो सकता है ( icontains ), लेकिन यह केवल मामूली रूप से बेहतर है।

एक डेटाबेस के अधिक उन्नत तुलना कार्य

यदि आप PostgreSQL का उपयोग कर रहे हैं, तो Django आपको अधिक जटिल क्वेरी विकल्पों का लाभ उठाने की अनुमति देने के लिए डेटाबेस विशिष्ट टूल का चयन प्रदान करता है । अन्य डेटाबेस में प्लगइन्स या उपयोगकर्ता द्वारा परिभाषित फ़ंक्शन के माध्यम से संभवतः टूल के विभिन्न चयन होते हैं। Django इस समय उनके लिए कोई समर्थन शामिल नहीं करता है। हम उस तरह के कार्यक्षमता डेटाबेस को प्रदर्शित करने के लिए PostgreSQL के कुछ उदाहरणों का उपयोग करेंगे।

अन्य डेटाबेस में खोज करना

django.contrib.postgres द्वारा प्रदान किए गए सभी खोज उपकरण पूरी तरह से सार्वजनिक APIs जैसे कस्टम लुकअप और डेटाबेस फ़ंक्शन पर django.contrib.postgres जाते हैं। अपने डेटाबेस के आधार पर, आपको समान एपीआई की अनुमति देने के लिए प्रश्नों का निर्माण करने में सक्षम होना चाहिए। यदि कुछ विशिष्ट चीजें हैं जो इस तरह से हासिल नहीं की जा सकती हैं, तो कृपया एक टिकट खोलें।

उपरोक्त उदाहरण में, हमने निर्धारित किया कि असंवेदनशील देखने का मामला अधिक उपयोगी होगा। गैर-अंग्रेजी नामों के साथ काम करते समय, एक और सुधार के लिए unaccented comparison का उपयोग करना है:

>>> Author.objects.filter(name__unaccent__icontains='Helen')
[<Author: Helen Mirren>, <Author: Helena Bonham Carter>, <Author: Hélène Joy>]

यह एक और मुद्दा दिखाता है, जहां हम नाम की एक अलग वर्तनी के खिलाफ मिलान कर रहे हैं। इस मामले में हमारे पास एक विषमता है - Helen लिए एक खोज Helena या Helen को ले जाएगी, लेकिन रिवर्स नहीं। एक अन्य विकल्प trigram_similar तुलना का उपयोग करना होगा, जो अक्षरों के अनुक्रमों की तुलना करता है।

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

>>> Author.objects.filter(name__unaccent__lower__trigram_similar='Hélène')
[<Author: Helen Mirren>, <Author: Hélène Joy>]

अब हमारे पास एक अलग समस्या है - "हेलेना बोनहम कार्टर" का लंबा नाम दिखाई नहीं देता क्योंकि यह बहुत लंबा है। ट्रिग्राम की खोज तीन अक्षरों के सभी संयोजनों पर विचार करती है, और तुलना करती है कि खोज और स्रोत दोनों में कितने दिखाई देते हैं। लंबे नाम के लिए, अधिक संयोजन हैं जो स्रोत स्ट्रिंग में दिखाई देते हैं इसलिए इसे अब एक करीबी मैच नहीं माना जाता है।

यहां तुलनात्मक कार्यों का सही विकल्प आपके विशेष डेटा सेट पर निर्भर करता है, उदाहरण के लिए इस्तेमाल की जाने वाली भाषा और प्रकार का पाठ खोजा जा रहा है। हमारे द्वारा देखे गए सभी उदाहरण छोटे तारों पर हैं जहां उपयोगकर्ता स्रोत डेटा के करीब (भिन्नताओं द्वारा) कुछ दर्ज करने की संभावना है।

  • "स्टॉप वर्ड्स" जैसे "ए", "द", "और" को अनदेखा करना।
  • तना हुआ शब्द, ताकि "टट्टू" और "टट्टू" समान माने जाएं।
  • विभिन्न मानदंडों के आधार पर शब्दों को भारित करना जैसे कि वे पाठ में कितनी बार दिखाई देते हैं, या फ़ील्ड्स का महत्व, जैसे शीर्षक या कीवर्ड, जो वे दिखाई देते हैं।

खोज सॉफ़्टवेयर का उपयोग करने के लिए कई विकल्प हैं, कुछ सबसे प्रमुख हैं Elastic और Solr । ये पूर्ण दस्तावेज़-आधारित खोज समाधान हैं। Django मॉडल के डेटा के साथ उनका उपयोग करने के लिए, आपको एक परत की आवश्यकता होगी जो आपके डेटा को एक टेक्स्ट डॉक्यूमेंट में ट्रांसलेट करती है, जिसमें डेटाबेस आईडी का बैक-रेफरेंस भी शामिल है। जब इंजन का उपयोग कर एक खोज एक निश्चित दस्तावेज़ लौटाती है, तो आप इसे डेटाबेस में देख सकते हैं। विभिन्न प्रकार के तीसरे पक्ष के पुस्तकालय हैं जो इस प्रक्रिया में मदद करने के लिए डिज़ाइन किए गए हैं।

PostgreSQL का समर्थन

PostgreSQL का अपना पूर्ण पाठ खोज कार्यान्वयन अंतर्निहित है। जबकि कुछ अन्य खोज इंजन के रूप में शक्तिशाली नहीं है, यह आपके डेटाबेस के अंदर होने का लाभ है और इसलिए आसानी से श्रेणीकरण जैसे अन्य संबंधपरक प्रश्नों के साथ जोड़ा जा सकता है।

django.contrib.postgres मॉड्यूल इन प्रश्नों को बनाने के लिए कुछ सहायक प्रदान करता है। उदाहरण के लिए, एक साधारण क्वेरी उन सभी ब्लॉग प्रविष्टियों का चयन करने के लिए हो सकती है जो "पनीर" का उल्लेख करती हैं:

>>> Entry.objects.filter(body_text__search='cheese')
[<Entry: Cheese on Toast recipes>, <Entry: Pizza recipes>]

आप फ़ील्ड और संबंधित मॉडल के संयोजन पर भी फ़िल्टर कर सकते हैं:

>>> Entry.objects.annotate(
...     search=SearchVector('blog__tagline', 'body_text'),
... ).filter(search='cheese')
[
    <Entry: Cheese on Toast recipes>,
    <Entry: Pizza Recipes>,
    <Entry: Dairy farming in Argentina>,
]

संपूर्ण विवरण के लिए contrib.postgres पूर्ण पाठ खोज दस्तावेज़ देखें।