Django迁移中如何创建GIN索引

How to create GIN index in Django migration

在 Django 中,从版本 1.11 开始我们有一个 class for PostgreSQL GinIndex (https://docs.djangoproject.com/en/1.11/ref/contrib/postgres/indexes/)。我想创建一个迁移,在我添加到我的一个表中的 VectorSearchField 上构建这样的索引。到目前为止,我尝试简单地将 db_index=True 添加到 VectorSearchField,但是失败了,因为它试图创建一个 B-Tree 索引(我认为)并且 VectorSearchField 值是太长了。

我设法通过 运行 一个 migrations.RunSQL() 迁移创建了我想要的索引:

CREATE INDEX entryline_sv_index ON entryline USING GIN (sv);

但是,我想,由于 Django 中有一个特殊的 GinIndex class,也许有一种方法可以创建这样的索引而无需执行 raw SQL?

这是一个模型class:

import django.contrib.postgres.search as pg_search

class EntryLine(models.Model):
    speaker = models.CharField(max_length=512, db_index=True)
    text = models.TextField()
    sv = pg_search.SearchVectorField(null=True)  # I want a GIN index on this field.

知道如何在迁移中为 sv 字段正确创建索引吗?还是执行 CREATE INDEX ... 查询是最好的方式?

还没有机会将我的旧手册 CREATE INDEX 代码迁移到 1.11 中引入的新系统,但我的理解是

from django.contrib.postgres.indexes import GinIndex
import django.contrib.postgres.search as pg_search
    
class EntryLine(models.Model):
    speaker = models.CharField(max_length=512, db_index=True)
    text = models.TextField()
    sv = pg_search.SearchVectorField(null=True) 
    class Meta:
        indexes = [GinIndex(fields=['sv'])]

是必需的。无需再使用原始 SQL CREATE INDEX 语句。