How to index select keys in Postgres jsonb data?
我在Postgres中使用jsonb类型来存储键值文档。 我在这些文档的顶部使用GIN索引来快速查找。 所有这些都很有效,尽管默认情况下GIN索引往往是冗长的,即它们索引jsonb结构中的每个键。 我想有更多的选择性索引。
是否可以使用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']; |
可以修改函数
这是相关的SqlFiddle http://sqlfiddle.com/#!17/b7935/6