/ / Wie man den GIN-Index in der Django-Migration erstellt - django, postgresql, Indizierung, Migration, django-Migrationen

Wie man den GIN-Index in der Django-Migration erstellt - django, postgresql, Indizierung, Migration, django-Migrationen

In Django haben wir seit Version 1.11 eine Klasse für PostgreSQL GinIndex (https://docs.djangoproject.com/en/1.11/ref/contrib/postgres/indexes/). Ich möchte eine Migration erstellen, die einen solchen Index auf einem VectorSearchField Ich habe zu einem meiner Tische hinzugefügt. Bisher habe ich versucht, einfach hinzuzufügen db_index=True zum VectorSearchField, aber das scheitert, weil es versucht, einen B-Tree-Index zu erstellen (denke ich) und die VectorSearchField Werte sind zu lang.

Ich habe es geschafft, den gewünschten Index zu erstellen, indem ich ein migrations.RunSQL() Migration mit:

CREATE INDEX entryline_sv_index ON entryline USING GIN (sv);

Allerdings denke ich, da gibt es ein besonderes GinIndex Klasse in Django, vielleicht gibt es eine Möglichkeit, einen solchen Index zu erstellen, ohne rohe SQL auszuführen?

Hier ist eine Modellklasse:

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.

Irgendeine Idee, wie man einen Index für richtig erstellt sv Feld in einer Migration? Oder führt das aus CREATE INDEX ... Frage den besten Weg?

Antworten:

10 für die Antwort № 1

Haven hatte noch keine Chance, meine alten manuellen CREATE INDEX Codes auf das neue System zu migrieren, das in 1.11 eingeführt wurde, aber mein Verständnis ist

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

Was benötigt wird. Raw SQL CREATE INDEX-Anweisungen müssen nicht mehr verwendet werden