このようなpostgresqlテーブルitems
があるとします。 (keywords
列はtext[]
タイプです)
name account_id keywords
------------------------------
foo1 1 ['k1', 'k2']
foo2 1 ['k1', 'k3']
foo3 2 ['k4', 'k1']
foo4 2 ['k1', 'k6']
Itemsの各行はAccount
に関連しています(テーブルはaccount_idによって仮想的に分割されています)。 「アカウント1のキーワードk1のアイテム」のようなクエリを作成します。このクエリでは、account_id
およびkeywords
列に複合GINインデックスが必要です。
実際には、次のような行を持つ逆索引が必要です(各行のキーは複合でなければなりません)。
(account_id, keyword) --> [item1, item2, ...]
Postgresqlでこのインデックスを作成する正しい方法は何ですか?
答えはこの質問の答えと同じです: 配列列を使用した内部結合
重要な点は、_btree_gin
_拡張機能のインストールです(これには、_postgresql-contrib
_などの追加パッケージが必要になる場合があります)
次に、拡張機能を次のようにして簡単に有効にすることができます(postgresql> = 9.1が必要)
_CREATE EXTENSION btree_gin;
_
インデックスは次のようにして作成できます:
CREATE INDEX index_name ON items USING GIN (account_id, keywords);