就像标题中所述,如何索引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时,我仍然看到它按顺序扫描...
在索引文本元素数组时我缺少什么?
答案 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
每次尝试搜索时,都会得到各种无效的令牌错误和其他类似的信息。