我有一个json,我将它存储为postgres中的jsonb。
{
"name": "Mr. Json",
"dept":{
"team":{
"aliases":["a1","a2","a3"],
"team_name": "xyz"
},
"type":"engineering",
"lead":"Mr. L"
},
"hobbies": ["Badminton", "Chess"],
"is_active": true
}
在列
上创建了GIN索引我需要执行完全匹配查询,例如包含type =' engineering'和领导='先生。 L&#39 ;. 我目前正在进行遏制查询,例如:
data @> '{"dept":{"type":"engineering"}}' and data @> '{"dept":{"lead":"Mr. L"}}'
我看到了显示GIN索引的查询计划正在使用,但我不确定这是否有效或是否有更好的方法来实现这一点。
我是否必须在嵌套键上构建另一个索引?
索引jsonb列是为索引嵌套键还是仅为顶级键索引?
另外,请分享一些有用的资源。
答案 0 :(得分:5)
来自docs:
jsonb的默认GIN运算符类支持使用顶级键存在运算符的查询?,?&和?|运算符和路径/值存在运算符@>。
对于包含@>
,它适用于嵌套值。对于其他运算符,它仅适用于顶级键或表达式索引中使用的任何级别。此外,根据文档,使用要查询的级别上的表达式索引将比整列上的简单索引更快(因为大小更小而有意义)。
如果您只进行遏制搜索,请考虑在构建索引时使用jsonb_path_ops
。它更小更快。