Django 2.1 - Full text search

पूरा पाठ खोजें




django

पूरा पाठ खोजें

इस दस्तावेज़ में उदाहरणों के लिए, हम प्रश्न बनाने में परिभाषित मॉडल का उपयोग करेंगे।

यह भी देखें

खोज के उच्च-स्तरीय अवलोकन के लिए, विषय प्रलेखन देखें।

search खोज

पूर्ण पाठ खोज का उपयोग करने का सबसे सरल तरीका डेटाबेस में एकल स्तंभ के खिलाफ एक शब्द खोजना है। उदाहरण के लिए:

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

यह डेटाबेस में body_text फ़ील्ड से एक to_tsvector बनाता है और डिफ़ॉल्ट डेटाबेस खोज कॉन्फ़िगरेशन का उपयोग करते हुए खोज शब्द 'Cheese' से एक plainto_tsquery । परिणाम क्वेरी और वेक्टर के मिलान द्वारा प्राप्त किए जाते हैं।

search लुकअप का उपयोग करने के लिए, 'django.contrib.postgres' आपके INSTALLED_APPS में होना चाहिए।

SearchVector

class SearchVector(*expressions, config=None, weight=None) [source]

एक ही क्षेत्र के खिलाफ खोज महान है, लेकिन सीमित करना। हमारे द्वारा खोजे जा रहे Entry उदाहरण एक Blog से संबंधित हैं, जिसमें एक tagline फ़ील्ड है। दोनों फ़ील्ड के विरुद्ध क्वेरी करने के लिए, SearchVector उपयोग करें:

>>> from django.contrib.postgres.search import SearchVector
>>> Entry.objects.annotate(
...     search=SearchVector('body_text', 'blog__tagline'),
... ).filter(search='Cheese')
[<Entry: Cheese on Toast recipes>, <Entry: Pizza Recipes>]

SearchVector तर्क किसी भी Expression या किसी क्षेत्र का नाम हो सकते हैं। एक स्थान का उपयोग करते हुए एक साथ कई तर्क दिए जाएंगे ताकि खोज दस्तावेज़ में उन सभी को शामिल किया जा सके।

SearchVector वस्तुओं को एक साथ जोड़ा जा सकता है, जिससे आप उन्हें पुन: उपयोग कर सकते हैं। उदाहरण के लिए:

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

config और weight मापदंडों की व्याख्या के लिए खोज कॉन्फ़िगरेशन और भार प्रश्नों को बदलते हुए देखें।

SearchQuery

class SearchQuery(value, config=None) [source]

SearchQuery उन शब्दों का अनुवाद करता है जो उपयोगकर्ता एक खोज क्वेरी ऑब्जेक्ट में प्रदान करता है जो डेटाबेस खोज वेक्टर से तुलना करता है। डिफ़ॉल्ट रूप से, उपयोगकर्ता द्वारा प्रदान किए गए सभी शब्द स्टेमिंग एल्गोरिदम के माध्यम से पारित किए जाते हैं, और फिर यह सभी परिणामी शब्दों के लिए मैचों की तलाश करता है।

अधिक लचीलापन प्रदान करने के लिए SearchQuery शर्तों को तार्किक रूप से जोड़ा जा सकता है:

>>> from django.contrib.postgres.search import SearchQuery
>>> SearchQuery('meat') & SearchQuery('cheese')  # AND
>>> SearchQuery('meat') | SearchQuery('cheese')  # OR
>>> ~SearchQuery('meat')  # NOT

config पैरामीटर की व्याख्या के लिए खोज कॉन्फ़िगरेशन बदलना देखें।

SearchRank

class SearchRank(vector, query, weights=None) [source]

अब तक, हमने केवल उन परिणामों को वापस किया है जिनके लिए वेक्टर और क्वेरी के बीच कोई भी मैच संभव है। यह संभव है कि आप किसी प्रकार की प्रासंगिकता के आधार पर परिणाम का आदेश दे सकते हैं। PostgreSQL एक रैंकिंग फ़ंक्शन प्रदान करता है जो ध्यान में रखता है कि दस्तावेज़ में क्वेरी शब्द कितनी बार दिखाई देते हैं, दस्तावेज़ में शर्तें एक साथ कितने करीब हैं, और दस्तावेज़ का हिस्सा कितना महत्वपूर्ण है, जहां वे होते हैं। मैच जितना बेहतर होगा, रैंक उतना ही अधिक होगा। प्रासंगिकता द्वारा ऑर्डर करने के लिए:

>>> from django.contrib.postgres.search import SearchQuery, SearchRank, SearchVector
>>> vector = SearchVector('body_text')
>>> query = SearchQuery('cheese')
>>> Entry.objects.annotate(rank=SearchRank(vector, query)).order_by('-rank')
[<Entry: Cheese on Toast recipes>, <Entry: Pizza recipes>]

weights पैरामीटर के स्पष्टीकरण के लिए वेटिंग क्वेरी देखें।

खोज कॉन्फ़िगरेशन बदलना

आप किसी भिन्न खोज कॉन्फ़िगरेशन का उपयोग करने के लिए किसी SearchVector और SearchQuery लिए config विशेषता निर्दिष्ट कर सकते हैं। यह डेटाबेस द्वारा परिभाषित एक अलग भाषा पार्सर्स और शब्दकोशों का उपयोग करने की अनुमति देता है:

>>> from django.contrib.postgres.search import SearchQuery, SearchVector
>>> Entry.objects.annotate(
...     search=SearchVector('body_text', config='french'),
... ).filter(search=SearchQuery('Å“uf', config='french'))
[<Entry: Pain perdu>]

config का मान दूसरे कॉलम में भी संग्रहीत किया जा सकता है:

>>> from django.db.models import F
>>> Entry.objects.annotate(
...     search=SearchVector('body_text', config=F('blog__language')),
... ).filter(search=SearchQuery('Å“uf', config=F('blog__language')))
[<Entry: Pain perdu>]

वेटिंग क्वेश्चन

प्रत्येक फ़ील्ड में क्वेरी में समान प्रासंगिकता नहीं हो सकती है, इसलिए आप उन्हें संयोजित करने से पहले विभिन्न वैक्टरों का भार निर्धारित कर सकते हैं:

>>> from django.contrib.postgres.search import SearchQuery, SearchRank, SearchVector
>>> vector = SearchVector('body_text', weight='A') + SearchVector('blog__tagline', weight='B')
>>> query = SearchQuery('cheese')
>>> Entry.objects.annotate(rank=SearchRank(vector, query)).filter(rank__gte=0.3).order_by('rank')

वजन निम्न अक्षरों में से एक होना चाहिए: डी, ​​सी, बी, ए। डिफ़ॉल्ट रूप से, ये वजन क्रमशः संख्या 0.1 , 0.2 , 0.4 और 1.0 को संदर्भित करता है। यदि आप उन्हें अलग तरह से वजन करना चाहते हैं, तो ऊपर दिए गए समान क्रम में SearchRank रूप में SearchRank को चार फ़्लोट्स की एक सूची दें:

>>> rank = SearchRank(vector, query, weights=[0.2, 0.4, 0.6, 0.8])
>>> Entry.objects.annotate(rank=rank).filter(rank__gte=0.3).order_by('-rank')

प्रदर्शन

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

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

SearchVectorField

class SearchVectorField [source]

यदि यह दृष्टिकोण बहुत धीमा हो जाता है, तो आप अपने मॉडल में एक SearchVectorField जोड़ सकते हैं। आपको इसे ट्रिगर के साथ आबाद रखने की आवश्यकता होगी, उदाहरण के लिए, जैसा कि PostgreSQL प्रलेखन में वर्णित है। फिर आप फ़ील्ड को क्वेरी कर सकते हैं जैसे कि यह एक एनोटेट SearchVector :

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

त्रिग्राम समानता

खोज के लिए एक और दृष्टिकोण समानता है। एक ट्रिग्राम तीन लगातार पात्रों का एक समूह है। trigram_similar लुकअप के अलावा, आप कुछ अन्य अभिव्यक्तियों का उपयोग कर सकते हैं।

उनका उपयोग करने के लिए, आपको PostgreSQL पर pg_trgm एक्सटेंशन को सक्रिय करना होगा । आप इसे TrigramExtension माइग्रेशन ऑपरेशन का उपयोग करके स्थापित कर सकते हैं।

TrigramSimilarity

class TrigramSimilarity(expression, string, **extra) [source]

एक क्षेत्र का नाम या अभिव्यक्ति, और एक स्ट्रिंग या अभिव्यक्ति को स्वीकार करता है। दोनों तर्कों के बीच ट्राइग्राम समानता लौटाता है।

उपयोग उदाहरण:

>>> from django.contrib.postgres.search import TrigramSimilarity
>>> Author.objects.create(name='Katy Stevens')
>>> Author.objects.create(name='Stephen Keats')
>>> test = 'Katie Stephens'
>>> Author.objects.annotate(
...     similarity=TrigramSimilarity('name', test),
... ).filter(similarity__gt=0.3).order_by('-similarity')
[<Author: Katy Stevens>, <Author: Stephen Keats>]

TrigramDistance

class TrigramDistance(expression, string, **extra) [source]

एक क्षेत्र का नाम या अभिव्यक्ति, और एक स्ट्रिंग या अभिव्यक्ति को स्वीकार करता है। दो तर्कों के बीच की ट्राइग्राम दूरी को लौटाता है।

उपयोग उदाहरण:

>>> from django.contrib.postgres.search import TrigramDistance
>>> Author.objects.create(name='Katy Stevens')
>>> Author.objects.create(name='Stephen Keats')
>>> test = 'Katie Stephens'
>>> Author.objects.annotate(
...     distance=TrigramDistance('name', test),
... ).filter(distance__lte=0.7).order_by('distance')
[<Author: Katy Stevens>, <Author: Stephen Keats>]