索引PostgreSQL JSONB数组元素

时间:2019-04-10 13:42:49

标签: postgresql jsonb database-indexes

就像标题中所述,如何索引JSONB数组?

内容看起来像...

["some_value", "another_value"]

我可以轻松访问...等元素

SELECT * FROM table WHERE data->>0 = 'some_value';

我这样创建了一个索引...

CREATE INDEX table_data_idx ON table USING gin ((data) jsonb_path_ops);

运行EXPLAIN时,我仍然看到它按顺序扫描...

在索引文本元素数组时我缺少什么?

2 个答案:

答案 0 :(得分:0)

如果您想使用索引支持该确切查询,则索引必须如下所示:

CREATE INDEX ON "table" ((data->>0));

如果要使用已有的索引,则不能将搜索限制为仅特定的数组元素(在您的情况下为第一个)。您可以加快数组中some_value 任意位置的搜索速度:

SELECT * FROM "table"
WHERE data @> '["some_value"]'::jsonb;

答案 1 :(得分:0)

我最终采取了另一种方法。我仍然无法使用JSONB类型进行搜索,因此最终将列切换为varchar ARRAY

CREATE TABLE table (
    data varchar ARRAY NOT NULL
);

CREATE INDEX table_data_idx ON table USING GIN (data);

SELECT * FROM table WHERE data @> '{some_value}';

这有效并且正在使用索引。


我认为JSONB方法的问题在于,该元素实际上嵌套得更远,并被视为文本。

data->'some_key'->>'array_key'->>0

每次尝试搜索时,都会得到各种无效的令牌错误和其他类似的信息。