sql >> データベース >  >> RDS >> PostgreSQL

Djangoモデルでトリグラム(gin_trgm_ops)を使用してGinインデックスを作成する

    2020年12月の記事 を見つけました 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'],
                )
            ]
    

    元のポスターのように、icontainsで機能するインデックスを作成しようとしている場合は、列の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 docs sugest:

    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. xamppを使用したApacheのインストール中にエラーが発生しました

    2. SQL Server、Python、およびOS X

    3. MySQLselectdistinctが機能しない

    4. 共有設定でお気に入りのリストビューを作成する