PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Django Tối ưu hóa Tìm kiếm Toàn văn - Postgres

Như đã được đề xuất bởi @knbk để cải thiện hiệu suất, bạn phải đọc Hiệu suất tìm kiếm toàn văn trong Django tài liệu.

Trong mã của mình, bạn có thể thêm trường vectơ tìm kiếm trong mô hình của mình với chỉ mục GIN có liên quan và bộ truy vấn có phương pháp mới để cập nhật trường:

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')
        ]

Bạn có thể cập nhật trường vectơ tìm kiếm mới của mình bằng phương pháp bộ truy vấn mới:

>>> 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", '')
)

Nếu bạn thực hiện một truy vấn và đọc phần giải thích, bạn có thể thấy chỉ mục GIN của mình được sử dụng:

>>> 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))

Nếu bạn muốn tìm hiểu sâu hơn, bạn có thể đọc bài viết mà tôi đã viết về chủ đề:

" Toàn văn Tìm kiếm trong Django với PostgreSQL "

Cập nhật

Tôi đã thử thực thi SQL tạo bởi Django ORM: 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. Cách tốt hơn nhiều câu lệnh SELECT?

  2. tiện ích gpload trong greenplum

  3. Thực hiện nâng cấp alembic trong nhiều lược đồ

  4. Postgresql:Kết nối bị từ chối. Kiểm tra xem tên máy chủ và cổng có chính xác không và người quản lý bưu điện có chấp nhận kết nối TCP / IP không

  5. vấn đề về loại dữ liệu nối tiếp pg_dump