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

Django मॉडल में ट्रिग्राम (gin_trgm_ops) के साथ एक जिन इंडेक्स बनाना

मुझे एक 12/2020 लेख मिला जो इस प्रकार Django ORM के नवीनतम संस्करण का उपयोग करता है:

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

यदि, मूल पोस्टर की तरह, आप एक इंडेक्स बनाना चाह रहे थे जो आइकॉन के साथ काम करता है, तो आपको कॉलम के UPPER() को इंडेक्स करना होगा, जिसके लिए 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',
            )
        ]

एक पुराने लेख से प्रेरित इस विषय पर, मैं एक वर्तमान वाला जो एक GistIndex . के लिए निम्नलिखित समाधान देता है :

अपडेट:Django-1.11 से चीजें आसान लगती हैं, जैसे यह जवाब और django डॉक्स सुझाव:

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

Django-2.2 , एक विशेषता opclasses class Index(fields=(), name=None, db_tablespace=None, opclasses=()) इस उद्देश्य के लिए।

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

जिसे आप अपनी मॉडल क्लास में इस तरह इस्तेमाल कर सकते हैं:

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. द्वीपों में टाइमस्टैम्प कैसे समूहित करें (मनमाने ढंग से अंतर के आधार पर)?

  2. Postgres '\connect कमांड का JDBC प्रतिरूप क्या है?

  3. खोज शब्द में थोड़ा सा परिवर्तन क्वेरी को इतना धीमा क्यों कर देता है?

  4. यूनियन ऑल व्यू पर धीमी क्वेरी

  5. शर्त मौजूद होने पर किसी अन्य तालिका से तालिका में एकाधिक पंक्तियों को अपडेट करें