हमने और अच्छी तरह से जांच-पड़ताल की कि खोज कैसे काम करती है।
दस्तावेजों के अनुसार आपको फ़ील्ड के अनुसार वज़न दिया जा सकता है और उन्हें वज़न भी दिया जा सकता है, और इसी तरह हम trigrams समानता या दूरी के आधार पर फ़िल्टर करने के लिए।
हालांकि, दोनों का उपयोग करने और आगे की जांच करने का एक उदाहरण निर्दिष्ट न करें और न ही यह समझ में आता है कि वजन कितना काम करता है।
थोड़ा तर्क हमें बताता है कि यदि हम सभी में एक सामान्य शब्द की तलाश करते हैं तो हम सभी 0 रैंक करेंगे, समानता श्रेणियों की तुलना में बहुत अधिक भिन्न होती है, हालांकि उस श्रेणी के मूल्यों को कम करने की प्रवृत्ति होती है।
अब, पाठ खोज, जहाँ तक हम समझते हैं, यह उन क्षेत्रों में निहित पाठ के आधार पर किया जाता है जिसे आप उस भाषा से भी अधिक फ़िल्टर करना चाहते हैं जिसे कॉन्फ़िगरेशन में रखा गया है। उदाहरण यह है कि शीर्षक डालने पर, प्रयुक्त मॉडल में एक शीर्षक फ़ील्ड और एक सामग्री फ़ील्ड था, जिसके सबसे सामान्य शब्द how change
थे , भारित शब्दों की समीक्षा करना (श्रेणियाँ क्वेरी के रूप में कार्य करती हैं, इसलिए हम values
. का उपयोग कर सकते हैं या values_list
रैंक और समानता की समीक्षा करने के लिए, जो संख्यात्मक मान हैं, हम भारित शब्दों को वेक्टर ऑब्जेक्ट देखते हुए देख सकते हैं) 'कैंबियार' या 'कोमो'; हालांकि, सभी मॉडलों में 'लोरेम इप्सुन ...' के समान पाठ शामिल था, और उस वाक्य के सभी शब्द यदि वे पूरे थे और वजन बी के साथ थे; हम इसके साथ यह निष्कर्ष निकालते हैं कि जिस भाषा से हम खोजों को कॉन्फ़िगर करते हैं, उससे अधिक फ़िल्टर करने के लिए फ़ील्ड की सामग्री के आधार पर खोजें की जाती हैं।
उस ने कहा, यहां हम वह कोड प्रस्तुत करते हैं जिसका उपयोग हम हर चीज के लिए करते हैं।
सबसे पहले, हमें डेटाबेस को सक्षम करने के लिए आवश्यक सीमा तक Trigrams का उपयोग करने की आवश्यकता है:
from django.db import migrations
from django.contrib.postgres.operations import UnaccentExtension, TrigramExtension
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
...
TrigramExtension(),
UnaccentExtension(),
]
postgres
. से माइग्रेशन के लिए आयात कार्रवाइयां पैकेज और किसी भी फ़ाइल माइग्रेशन से चलाएँ।
अगला चरण प्रश्न के कोड को बदलना है ताकि फ़िल्टर एक क्वेरी को वापस कर दे यदि दूसरा विफल हो जाता है:
def get_queryset(self):
search_query = SearchQuery(self.request.GET.get('q', ''))
vector = SearchVector(
'name',
weight='A',
config=settings.SEARCH_LANGS[settings.LANGUAGE_CODE],
) + SearchVector(
'content',
weight='B',
config=settings.SEARCH_LANGS[settings.LANGUAGE_CODE],
)
if self.request.user.is_authenticated:
queryset = Article.actives.all()
else:
queryset = Article.publics.all()
return queryset.annotate(
rank=SearchRank(vector, search_query)
similarity=TrigramSimilarity(
'name', search_query
) + TrigramSimilarity(
'content', search_query
),
).filter(Q(rank__gte=0.3) | Q(similarity__gt=0.3)).order_by('-rank')[:20]
उपरोक्त कोड के साथ समस्या एक के बाद एक क्वेरी को रिस रही थी, और यदि चुना गया शब्द दोनों में से किसी भी खोज में प्रकट नहीं होता है तो समस्या अधिक होती है। हम एक Q
. का उपयोग करते हैं OR
. का उपयोग करके फ़िल्टर करने के लिए ऑब्जेक्ट कनेक्टर ताकि यदि दोनों में से कोई एक वांछित मान नहीं लौटाता है, तो दूसरे को उसी स्थान पर भेज दें।
इसके साथ ही पर्याप्त है, हालांकि, Django के नवीनतम संस्करण द्वारा पेश किए गए इस नए लाभ का अधिकतम लाभ उठाने के लिए, ये वज़न और त्रिकोण कैसे काम करते हैं, इस पर गहराई से स्वागत योग्य स्पष्टीकरण हैं।