Suponha uma tabela postgresql items
como esta. ( keywords
a coluna é do tipo text[]
)
name account_id keywords
------------------------------
foo1 1 ['k1', 'k2']
foo2 1 ['k1', 'k3']
foo3 2 ['k4', 'k1']
foo4 2 ['k1', 'k6']
Cada linha em itens está relacionada a um Account
(a tabela é virtualmente dividida por account_id). Queremos fazer consultas como: "itens para a conta 1 com a palavra-chave k1". Esta consulta requer um índice GIN composto em account_id
e keywords
coluna.
Na verdade, precisamos de um índice invertido, com linhas assim: (a chave para cada linha deve ser composta)
(account_id, keyword) --> [item1, item2, ...]
Qual é a maneira certa de criar esse índice no postgresql?
A resposta é a mesma para esta pergunta: Inner join usando uma coluna de matriz
O ponto principal é instalar a
btree_gin
extensão (isso pode exigir um pacote adicional, comopostgresql-contrib
)Então, a extensão pode ser habilitada facilmente com: (requer postgresql >= 9.1)
CREATE EXTENSION btree_gin;
E o índice pode ser criado com:
CREATE INDEX index_name ON items USING GIN (account_id, keywords);