Создание индекса 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));