2017-06-02 63 views
3

我有一个json,我将它作为jsonb存储在postgres中。postgres jsonb列上的GIN索引是否嵌套?

{ 
    "name": "Mr. Json", 
    "dept":{ 
    "team":{ 
     "aliases":["a1","a2","a3"], 
     "team_name": "xyz" 
    }, 
    "type":"engineering", 
    "lead":"Mr. L" 
    }, 
    "hobbies": ["Badminton", "Chess"], 
    "is_active": true 
} 

已创建的列

我需要做精确匹配查询,如包含类型=“工程”的所有行,并导致='先生一个GIN索引。 L”。 我目前做的遏制查询:

data @> '{"dept":{"type":"engineering"}}' and data @> '{"dept":{"lead":"Mr. L"}}' 

我看到查询计划,显示正在使用GIN索引,但我不能确定这是否正常工作或是否有实现这一目标的一些更好的方法。

我需要在嵌套键上构造另一个索引吗?

索引jsonb列索引嵌套键或只是最高级的索引?

也请分享一些很好的资源。

+0

为什么不只是'data @''{“dept”:{“lead”:“Mr。L”,“type”:“engineering”}}''?您的查询将使用索引两次,而这(相当于)将只使用一次。 – pozs

回答

4

docs

为jsonb默认GIN操作符类支持的查询与顶级密钥存在运营商,? &和?|运营商和路径/价值运营商@>。

遏制@>它与嵌套值一起使用。对于其他运算符,它仅适用于顶级键或表达式索引中使用的任何级别。另外,根据文档,在想要查询的级别上使用表达式索引将比在整列上使用简单索引快(这是有意义的,因为大小较小)。

如果您只进行收容搜索,请在构建索引时考虑使用jsonb_path_ops。它更小更快。