PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

Django पूर्ण पाठ खोज अनुकूलन - पोस्टग्रेज

जैसा कि पहले ही @knbk द्वारा प्रदर्शन सुधार के लिए सुझाव दिया गया है, आपको पूर्ण-पाठ खोज प्रदर्शन Django . में अनुभाग दस्तावेज़ीकरण।

अपने कोड में आप संबंधित GIN इंडेक्स के साथ अपने मॉडल में एक खोज वेक्टर फ़ील्ड और फ़ील्ड को अपडेट करने के लिए एक नई विधि के साथ एक क्वेरीसेट जोड़ सकते हैं:

from django.contrib.postgres.indexes import GinIndex
from django.contrib.postgres.search import SearchVector, SearchVectorField
from django.db import models
from postgres_copy import CopyQuerySet


class AddressesQuerySet(CopyQuerySet):

    def update_search_vector(self):
        return self.update(search_vector=SearchVector(
            'number', 'street', 'unit', 'city', 'region', 'postcode'
        ))


class Addresses(models.Model):
    date_update = models.DateTimeField(auto_now=True, null=True)
    longitude = models.DecimalField(max_digits=9, decimal_places=6, null=True)
    latitude = models.DecimalField(max_digits=9, decimal_places=6, null=True)
    number = models.CharField(max_length=16, null=True, default='')
    street = models.CharField(max_length=60, null=True, default='')
    unit = models.CharField(max_length=50, null=True, default='')
    city = models.CharField(max_length=50, null=True, default='')
    district = models.CharField(max_length=10, null=True, default='')
    region = models.CharField(max_length=5, null=True, default='')
    postcode = models.CharField(max_length=5, null=True, default='')
    addr_id = models.CharField(max_length=20, unique=True)
    addr_hash = models.CharField(max_length=20, unique=True)
    search_vector = SearchVectorField(null=True, editable=False)

    objects = AddressesQuerySet.as_manager()

    class Meta:
        indexes = [
            GinIndex(fields=['search_vector'], name='search_vector_idx')
        ]

आप नई क्वेरीसेट पद्धति का उपयोग करके अपने नए खोज वेक्टर फ़ील्ड को अपडेट कर सकते हैं:

>>> Addresses.objects.update_search_vector()
UPDATE "addresses_addresses"
SET "search_vector" = to_tsvector(
  COALESCE("addresses_addresses"."number", '') || ' ' ||
  COALESCE("addresses_addresses"."street", '') || ' ' ||
  COALESCE("addresses_addresses"."unit", '') || ' ' ||
  COALESCE("addresses_addresses"."city", '') || ' ' ||
  COALESCE("addresses_addresses"."region", '') || ' ' ||
  COALESCE("addresses_addresses"."postcode", '')
)

यदि आप कोई प्रश्न निष्पादित करते हैं और व्याख्या पढ़ते हैं तो आप अपने GIN अनुक्रमणिका का उपयोग करते हुए देख सकते हैं:

>>> print(Addresses.objects.filter(search_vector='north').values('id').explain(verbose=True))
EXPLAIN (VERBOSE true)
SELECT "addresses_addresses"."id"
FROM "addresses_addresses"
WHERE "addresses_addresses"."search_vector" @@ (plainto_tsquery('north')) = true [0.80ms]
Bitmap Heap Scan on public.addresses_addresses  (cost=12.25..16.52 rows=1 width=4)
  Output: id
  Recheck Cond: (addresses_addresses.search_vector @@ plainto_tsquery('north'::text))
  ->  Bitmap Index Scan on search_vector_idx  (cost=0.00..12.25 rows=1 width=0)
        Index Cond: (addresses_addresses.search_vector @@ plainto_tsquery('north'::text))

यदि आप और गहरा करना चाहते हैं तो आप एक लेख . पढ़ सकते हैं जो मैंने इस विषय पर लिखा है:

"पूर्ण-पाठ PostgreSQL के साथ Django में खोजें "

अपडेट करें

मैंने Django ORM द्वारा उत्पन्न SQL को निष्पादित करने का प्रयास किया:http://sqlfiddle.com/#!17 /f9aa9/1



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पोस्टग्रेज:केवल INSERT पर चेक के साथ बाधा

  2. डीओ ब्लॉक के अंदर psql मेटा-कमांड द्वारा निर्धारित चर का उपयोग करें

  3. पोस्टग्रेज 11 . में मौजूदा तालिका में विभाजन सूची संलग्न करें

  4. PHP PG में प्रश्नों को समझने के लिए -तैयार स्टेटमेन्स

  5. Psycopg2 छवि नहीं मिली