/ / Ako vytvoriť index GIN v migrácii Django - django, postgresql, indexovanie, migrácia, django-migrácie

Ako vytvoriť index GIN v migrácii Django - django, postgresql, indexovanie, migrácia, django-migrácie

V Django, od verzie 1.11 máme triedy pre PostgreSQL GinIndex (https://docs.djangoproject.com/en/1.11/ref/contrib/postgres/indexes/). Rád by som vytvoril migráciu, ktorá konštruuje takýto index na VectorSearchField Pridal som do jedného z mojich tabuliek. Zatiaľ som sa pokúsil jednoducho doplniť db_index=True na VectorSearchField, ale to zlyhá, pretože sa snaží vytvoriť index B-Tree (myslím) a VectorSearchField hodnoty sú príliš dlhé.

Podarilo sa mi vytvoriť index, ktorý chcem spustiť a migrations.RunSQL() migrácia s:

CREATE INDEX entryline_sv_index ON entryline USING GIN (sv);

Myslím však, že existuje špeciálna GinIndex triedy v Django, možno existuje spôsob, ako vytvoriť takýto index bez vykonania surového SQL?

Tu je modelová trieda:

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.

Akékoľvek nápady, ako správne vytvoriť index pre sv pole v migrácii? Alebo je vykonávanie CREATE INDEX ... hľadanie najlepšieho spôsobu?

odpovede:

10 pre odpoveď č. 1

Haven "ešte nemal šancu migrovať moje staré manuálne kódy CREATE INDEX do nového systému zavedeného v 1.11, ale moje chápanie je

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

Je to, čo sa vyžaduje.Raw SQL CREATE INDEX vyhlásenia už nemusia byť použité