特定の値を含むコレクションを検索するためにコレクションのインデックスを作成し、データベースのクエリーを実行する方法。
Cassandra 2.1以降では、コレクションにインデックスを付け、特定の値を含んでいるコレクションを見つけるためにデータベースにクエリーすることができます。セットとリストのインデックスは、マップとは若干異なった方法で作成されます。これは、マップのキーと値の性質が異なるためです。セカンダリ・インデックスの使用に関するすべての注意は、コレクションのインデックスの作成にも適用されます。
手順
-
セットにインデックスを作成し、特定のチームに属しているすべてのサイクリストを検索します。
CREATE INDEX team_idx ON cycling.cyclist_career_teams ( teams ); SELECT * FROM cycling.cyclist_career_teams WHERE teams CONTAINS 'Nederland bloeit';
-
マップにインデックスを作成し、特定の年のサイクリストとチームの組み合わせをすべて検索します。
CREATE INDEX team_year_idx ON cycling.cyclist_teams ( KEYS (teams) ); SELECT * From cycling.cyclist_teams WHERE teams CONTAINS KEY 2015;
キーとマップの値のインデックスは共存できません。たとえば、2番目のテーブルcyclist_teamsに対してチームのインデックスを作成した場合は、それを削除してから、以下に示すようにネストされた丸かっこの中でKEYSキーワードとマップ名を使用して、マップ・キーのインデックスを作成する必要があります。
-
マップのエントリーにインデックスを作成し、年齢が同じサイクリストを検索します。
ENTRIES
を使用したインデックスは、マップに対してのみ有効です。
CREATE TABLE cycling.birthday_list (cyclist_name text PRIMARY KEY, blist map<text,text>; );CREATE INDEX blist_idx ON cycling.birthday_list (ENTRIES(blist)); SELECT * FROM cycling.birthday_list WHERE blist['age'] = '23';
-
同じインデックスを使用して、同じ出身国のサイクリストを検索します。
SELECT * FROM cyclist.birthday_list WHERE blist['nation'] = 'NETHERLANDS';
-
FROZEN
マップの完全なコンテンツにインデックスを作成します。この例のテーブルは、サイクリストのプロ優勝の数、出場したグランド・ツアー・レースおよびクラシック・レースの数を格納します。SELECT文は、39回のプロ優勝、7回のグランド・ツアー出場、および14回のクラシック出場の記録を持つサイクリストを検索します。
CREATE TABLE cycling.race_starts (cyclist_name text PRIMARY KEY, rnumbers FROZEN<LIST<int>>); CREATE INDEX rnumbers_idx ON cycling.race_starts (FULL(rnumbers)); SELECT * FROM cycling.race_starts WHERE rnumbers = [39,7,14];