0

在带有名为 的 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));
4

0 回答 0