जैसा कि पहले ही @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