GIN Index
- GIN index stands for Generalised Invert Index.
- Speeds up full text searches
- A GIN index stores a set of (key, posting list) pairs, where a posting list is a set of row IDs in which the key occurs. The same row ID can appear in multiple posting lists, since an item can contain more than one key.
- Each key value is stored only once, so a GIN index is very compact for cases where the same key appears many times.
Query
select * from contacts_docs
where body @> '{"first_name":"John"}';
explain select * from contacts_docs
where body @> '{"first_name":"John"}';
Creating a GIN Index
create index idx_gin_contacts_docs_body on contacts_docs USING GIN(body);

Get Size of Index
select pg_size_pretty((pg_relation_size('idx_gin_contacts_docs_body'::regclass)))
as index_name;

Using JSONB_PATH_OPS ( better )
create index idx_gin_contacts_docs_body_cool
on contacts_docs USING GIN(body jsonb_path_ops);

Size with jsonb_path_ops
select pg_size_pretty((pg_relation_size('idx_gin_contacts_docs_body_cool'::regclass)))
as index_name;

On Specific column for smaller size ( not working )
select pg_size_pretty((pg_relation_size('idx_gin_contacts_docs_body_fname'::regclass)))
as index_name;
