Создание индекса GIN с использованием SearchVector в поле JSONB без приведения его к тексту

В модели Django с полем JSON с именем some_jsonfield, существует индекс GIN, определяемый следующим образом:

       GinIndex( 
     SearchVector( 
         'some_jsonfield', 
         config='english'), 
     name='jsonfield_ts_gin', 
 ),

И сделанные запросы выглядят следующим образом:

      SELECT id FROM my_table
WHERE to_tsvector('english', some_jsonfield) @@ websearch_to_tsquery('english', %s)

Можно было бы подумать, что индекс должен применяться, но у меня было подозрение, что это не так.

Оказывается, следующий SQL генерируется миграцией, которая добавляет указанный выше индекс:

      CREATE INDEX "some_jsonfield" ON "my_table"
USING gin ((to_tsvector('english'::regconfig, COALESCE(("some_jsonfield")::text, ''))));

Судя по всему, Джанго думает, что мы хотим привести поле JSON к виду ::text. Тем не менее, запросы применяются to_tsvector() непосредственно в JSONB, что заставляет меня поверить, что этот индекс в конечном итоге не используется.

Можно создать требуемый индекс с помощью необработанного SQL, но мне интересно, не упускаю ли я что-то, и если нет, то есть ли способ добиться следующего с помощью ORM:

      CREATE INDEX "some_jsonfield" ON "my_table"
USING gin (to_tsvector('english'::regconfig, some_jsonfield));

0 ответов

Другие вопросы по тегам