关于postgresql:如何索引Postgres jsonb数据中的选择键?

How to index select keys in Postgres jsonb data?

我在Postgres中使用jsonb类型来存储键值文档。 我在这些文档的顶部使用GIN索引来快速查找。 所有这些都很有效,尽管默认情况下GIN索引往往是冗长的,即它们索引jsonb结构中的每个键。 我想有更多的选择性索引。

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

  • 让GIN仅索引顶级键,并使嵌套结构保持未索引状态吗? 要么
  • 让GIN只索引特定的关键字(我知道我可以为每个需要索引的关键字创建单独的btree索引。我有兴趣知道我是否可以通过GIN完成它)
  • 谢谢。


    它可以使用辅助函数来完成,该函数将JSONB文档作为输入和键数组,并返回一个过滤了密钥的新文档,然后您可以使用GIN进行索引:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    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}';

    您可能希望对要在函数内部过滤的键集进行硬编码,以避免在查询中重复这些键。

    如果您只想索引某些键的存在,那么:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    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以仅包含要索引的键。

    这是相关的SqlFiddle http://sqlfiddle.com/#!17/b7935/6