2017-05-04 5 views
2

Djangoでは、バージョン1.11以降、PostgreSQLのクラスはGinIndexhttps://docs.djangoproject.com/en/1.11/ref/contrib/postgres/indexes/)です。私はVectorSearchField私のテーブルの1つに追加してそのようなインデックスを構築する移行を作成したいと思います。これまでのところ、にdb_index=Trueを追加しようとしましたが、Bツリーインデックスを作成しようとしていて、VectorSearchFieldの値が長すぎるため、失敗します。Djangoの移行でGINインデックスを作成する方法

私はmigrations.RunSQL()移行を実行することにより、私が欲しいのインデックスを作成するために管理:特別GinIndexクラスはジャンゴでありますのでしかし、私は推測、おそらくこのようなインデックスを作成する方法がある

CREATE INDEX entryline_sv_index ON entryline USING GIN (sv); 

生のSQLを実行しないで?

ここでモデルクラスです:

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 ...クエリを実行するのが最善の方法ですか?

答えて

7

はまだ私の古いマニュアルを移行する機会がなかった1.11で導入された新しいシステムにINDEXコードを作成しても、私の理解では、

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ステートメントをもう使用する必要はありません

+0

これはまさに私が望んでいたものです! :)ちょうどGinIndexクラスを使用する適切な方法を知らなかった。ありがとうございました! – Maciek

+0

うれしい私は助けることができます。あなたのプロジェクトで最高のもの – e4c5

+2

これはすばらしいことです。ありがとうございます。ドキュメントには使用方法の例は含まれていません。 1つの質問です。それは 'GinIndex(fields = ['sv'])'ではないでしょうか?私は何かが欠落していない限り、メタの 'sv'は別途定義されないと思います。 – yekta

関連する問題