在带有名为 的 JSON 字段的 Django 模型上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, ''))));
显然,Django 认为我们想要将 JSON 字段转换为::text
. 但是,查询to_tsvector()
直接应用于 JSONB,这让我相信这个索引最终不会被使用。
可以使用原始 SQL 创建所需的索引,但我想知道我是否遗漏了什么,如果没有,是否有办法使用 ORM 实现以下目标:
CREATE INDEX "some_jsonfield" ON "my_table"
USING gin (to_tsvector('english'::regconfig, some_jsonfield));