PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Membuat Indeks Gin dengan Trigram (gin_trgm_ops) dalam model Django

Saya menemukan artikel 12/2020 yang menggunakan versi terbaru Django ORM seperti:

class Author(models.Model):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)

    class Meta:
        indexes = [
            GinIndex(
                name='review_author_ln_gin_idx', 
                fields=['last_name'], 
                opclasses=['gin_trgm_ops'],
            )
        ]

Jika, seperti poster aslinya, Anda ingin membuat indeks yang berfungsi dengan ikon, Anda harus mengindeks UPPER() kolom, yang memerlukan penanganan khusus dari OpClass :

from django.db.models.functions import Upper
from django.contrib.postgres.indexes import GinIndex, OpClass

class Author(models.Model):
        indexes = [
            GinIndex(
                OpClass(Upper('last_name'), name='gin_trgm_ops'),
                name='review_author_ln_gin_idx',
            )
        ]

Terinspirasi dari artikel lama tentang hal ini, saya membuka yang sekarang yang memberikan solusi berikut untuk GistIndex :

Pembaruan:Dari Django-1.11 segalanya tampak lebih sederhana, karena jawaban ini dan django docs saran:

from django.contrib.postgres.indexes import GinIndex

class MyModel(models.Model):
    the_field = models.CharField(max_length=512, db_index=True)

    class Meta:
        indexes = [GinIndex(fields=['the_field'])]

Dari Django-2.2 , sebuah atribut opclasses akan tersedia di kelas class Index(fields=(), name=None, db_tablespace=None, opclasses=()) untuk tujuan ini.

from django.contrib.postgres.indexes import GistIndex

class GistIndexTrgrmOps(GistIndex):
    def create_sql(self, model, schema_editor):
        # - this Statement is instantiated by the _create_index_sql()
        #   method of django.db.backends.base.schema.BaseDatabaseSchemaEditor.
        #   using sql_create_index template from
        #   django.db.backends.postgresql.schema.DatabaseSchemaEditor
        # - the template has original value:
        #   "CREATE INDEX %(name)s ON %(table)s%(using)s (%(columns)s)%(extra)s"
        statement = super().create_sql(model, schema_editor)
        # - however, we want to use a GIST index to accelerate trigram
        #   matching, so we want to add the gist_trgm_ops index operator
        #   class
        # - so we replace the template with:
        #   "CREATE INDEX %(name)s ON %(table)s%(using)s (%(columns)s gist_trgrm_ops)%(extra)s"
        statement.template =\
            "CREATE INDEX %(name)s ON %(table)s%(using)s (%(columns)s gist_trgm_ops)%(extra)s"

        return statement

Yang kemudian dapat Anda gunakan di kelas model Anda seperti ini:

class YourModel(models.Model):
    some_field = models.TextField(...)

    class Meta:
        indexes = [
            GistIndexTrgrmOps(fields=['some_field'])
        ]


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tidak dapat menghubungkan Aplikasi Android Studio saya dengan PostgreSQL

  2. pgAdmin III Mengapa hasil kueri dipersingkat?

  3. PostgreSQL:memulai urutan di MAX(the_column)+1

  4. Cara Mengaktifkan SSL di PostgreSQL

  5. Koneksi JDBC Postgres di Bantuan Eclipse