Supposons une table PostgreSQL items
comme ceci. (keywords
colonne est de type text[]
)
name account_id keywords
------------------------------
foo1 1 ['k1', 'k2']
foo2 1 ['k1', 'k3']
foo3 2 ['k4', 'k1']
foo4 2 ['k1', 'k6']
Chaque ligne d'éléments est liée à un Account
(la table est pratiquement écartée par compte_id). Nous voulons faire des questions comme: "Articles pour le compte 1 avec le mot-clé K1". Cette requête nécessite un indice de gin composite sur account_id
et keywords
colonne.
En fait, nous avons besoin d'un index inversé, avec des lignes comme ceci: (la clé de chaque ligne devrait être composite)
(account_id, keyword) --> [item1, item2, ...]
Quelle est la bonne façon de créer cet index dans PostgreSQL?
La réponse est la même que la réponse à cette question: Joindre interne à l'aide d'une colonne de tablea
Le point principal consiste à installer l'extension btree_gin
(cela peut nécessiter un package supplémentaire, comme postgresql-contrib
)
Ensuite, l'extension peut être activée facilement avec: (nécessite PostgreSQL> = 9.1)
CREATE EXTENSION btree_gin;
Et l'index peut être créé avec:
CREATE INDEX index_name ON items USING GIN (account_id, keywords);