Postgresql 如何索引Postgres jsonb数据中的选择键?

Postgresql 如何索引Postgres jsonb数据中的选择键?,postgresql,Postgresql,我在Postgres中使用jsonb类型来存储键值文档。我在这些文档上使用GIN索引进行快速查找。尽管默认情况下GIN索引往往是冗长的,也就是说,它们对jsonb结构中的每个键都进行索引,但所有这些都可以正常工作。我想有更多的选择性索引 是否可以使用GIN索引执行这些操作 让GIN只索引顶级键,而不索引嵌套结构?或 只有GIN索引特定的关键字(我知道我可以为每个需要索引的关键字创建单独的btree索引。我想知道我是否可以通过GIN完成) 谢谢。可以使用辅助函数来完成,该函数将JSONB文档作为输

我在Postgres中使用jsonb类型来存储键值文档。我在这些文档上使用GIN索引进行快速查找。尽管默认情况下GIN索引往往是冗长的,也就是说,它们对jsonb结构中的每个键都进行索引,但所有这些都可以正常工作。我想有更多的选择性索引

是否可以使用GIN索引执行这些操作

  • 让GIN只索引顶级键,而不索引嵌套结构?或
  • 只有GIN索引特定的关键字(我知道我可以为每个需要索引的关键字创建单独的btree索引。我想知道我是否可以通过GIN完成)

  • 谢谢。

    可以使用辅助函数来完成,该函数将JSONB文档作为输入和键数组,并返回一个新文档,其中键已过滤,然后您可以使用GIN索引:

    create function jsonb_filter(doc jsonb, variadic keys text[]) 
    returns jsonb
    as 'select jsonb_object_agg(key, doc->key) from unnest(keys) key'
    language sql
    immutable;
    
    create index filtered_index on jsonb_table 
    using gin (jsonb_filter(data, 'a', 'b'));
    
    select data->'a'
    from jsonb_table
    where jsonb_filter(data, 'a', 'b') @> '{"a":1}';
    
    您可能希望在函数内部对要筛选的键集进行硬编码,以避免在查询中重复这些键

    如果只想对某些键的存在进行索引,则:

    create function jsonb_keys(doc jsonb) 
    returns text[]
    as 'select array_agg(key) from jsonb_object_keys(doc) key'
    language sql
    immutable;
    
    create index keys_index on jsonb_table 
    using gin (jsonb_keys(data));
    
    select data->'b'
    FROM jsonb_table
    where jsonb_keys(data) @> ARRAY['a'];
    
    可以修改函数
    jsonb_keys
    ,使其仅包含要索引的键


    下面是相关的SQLFIDLE

    是否向FIDLE添加更多数据?那么它将开始使用yoiur索引?否则演示将不起作用:)@VaoTsun有效点,但使索引符合条件的关键是在查询筛选器中使用索引表达式:)