コレクションを使用したSAIインデックス
SAIは、map
、list
、set
型の集合をサポートしています。集合を使用すると、データを列にまとめて格納できます。
リレーショナルデータベースでは、ユーザーの複数のメールアドレスなどのグループ化は、(たとえば)user
テーブルとemail
テーブル間の多対一の結合関係によって実現されます。Apache Cassandraは、ユーザーのメールアドレスをuser
テーブルの集合列に格納することにより、2つのテーブル間の結合を回避します。各集合は、保持されるデータのデータ型を指定します。
集合は、集合ストレージのデータが限定的な場合に適しています。データがメッセージの送信や毎秒登録されるセンサーイベントのように無制限に増加する可能性がある場合は、集合を使用しないでください。代わりに、データがクラスタリング列に格納される複合主キーを持つテーブルを使用してください。
SAIインデックスを持つデータベーステーブルのCQLクエリでは、
|
set型の使用
この例では、次のテーブルとインデックスを使用します。
CREATE TABLE IF NOT EXISTS cycling.cyclist_career_teams (
id UUID PRIMARY KEY,
lastname text,
teams set<text>
);
CREATE INDEX teams_idx
ON cycling.cyclist_career_teams (teams)
USING 'sai';
cyclist_career_teams
テーブルの集合列teams
にインデックスが作成されます。
集合teams
列からのCONTAINS
を使用したクエリ
SELECT * FROM cycling.cyclist_career_teams
WHERE teams CONTAINS 'Rabobank-Liv Giant';
id | lastname | teams
--------------------------------------+----------+------------------------------------------------------------------------------------------------------
5b6962dd-3f90-4c93-8f61-eabfa4a803e2 | VOS | {'Nederland bloeit', 'Rabobank Women Team', 'Rabobank-Liv Giant', 'Rabobank-Liv Woman Cycling Team'}
list型の使用
この例では、次のテーブルとインデックスを使用します。
CREATE TABLE IF NOT EXISTS cycling.upcoming_calendar (
year int,
month int,
events list<text>,
PRIMARY KEY (year, month)
);
CREATE INDEX events_idx
ON cycling.upcoming_calendar (events)
USING 'sai';
upcoming_calendar
テーブルのリスト列events
にインデックスが作成されます。
リストevents
列からのCONTAINS
を使用したクエリ
SELECT * FROM cycling.upcoming_calendar
WHERE events CONTAINS 'Criterium du Dauphine';
year | month | events
------+-------+-----------------------------------------------
2015 | 6 | ['Criterium du Dauphine', 'Tour de Sui\nsse']
少し複雑なクエリでは、特定のイベントを含む行、または特定の月の日付を持つ行を選択します。
map型の使用
この例では、次のテーブルとインデックスを使用します。
CREATE TABLE IF NOT EXISTS cycling.cyclist_teams (
id uuid PRIMARY KEY,
firstname text,
lastname text,
teams map<int, text>
);
CREATE INDEX IF NOT EXISTS team_year_keys_idx
ON cycling.cyclist_teams ( KEYS (teams) );
CREATE INDEX IF NOT EXISTS team_year_entries_idx
ON cycling.cyclist_teams ( ENTRIES (teams) );
CREATE INDEX IF NOT EXISTS team_year_values_idx
ON cycling.cyclist_teams ( VALUES (teams) );
cyclist_career_teams
テーブルのマップ列teams
に作成されたインデックスは、列データのキー、値、完全なエントリをターゲットにします。
マップteams
列からのKEYS
を使用したクエリ
SELECT * FROM cyclist_teams WHERE teams CONTAINS KEY 2014;
id | firstname | lastname | teams
--------------------------------------+-----------+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
cb07baad-eac8-4f65-b28a-bddc06a0de23 | Elizabeth | ARMITSTEAD | {2011: 'Team Garmin - Cervelo', 2012: 'AA Drink - Leontien.nl', 2013: 'Boels:Dolmans Cycling Team', 2014: 'Boels:Dolmans Cycling Team', 2015: 'Boels:Dolmans Cycling Team'}
5b6962dd-3f90-4c93-8f61-eabfa4a803e2 | Marianne | VOS | {2014: 'Rabobank-Liv Woman Cycling Team', 2015: 'Rabobank-Liv Woman Cycling Team'}
マップteams
列から値をクエリします。キーワードCONTAINS
のみが含まれていることに注意してください。
SELECT * FROM cyclist_teams WHERE teams CONTAINS 'Team Garmin - Cervelo';
id | firstname | lastname | teams
--------------------------------------+-----------+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
cb07baad-eac8-4f65-b28a-bddc06a0de23 | Elizabeth | ARMITSTEAD | {2011: 'Team Garmin - Cervelo', 2012: 'AA Drink - Leontien.nl', 2013: 'Boels:Dolmans Cycling Team', 2014: 'Boels:Dolmans Cycling Team', 2015: 'Boels:Dolmans Cycling Team'}
WHERE
句の違いに注意して、マップteams
列からエントリをクエリします。
SELECT * FROM cyclist_teams
WHERE
teams[2014] = 'Boels:Dolmans Cycling Team'
AND teams[2015] = 'Boels:Dolmans Cycling Team';
id | firstname | lastname | teams
--------------------------------------+-----------+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
cb07baad-eac8-4f65-b28a-bddc06a0de23 | Elizabeth | ARMITSTEAD | {2011: 'Team Garmin - Cervelo', 2012: 'AA Drink - Leontien.nl', 2013: 'Boels:Dolmans Cycling Team', 2014: 'Boels:Dolmans Cycling Team', 2015: 'Boels:Dolmans Cycling Team'}
この例では、マップteams
列に2つのエントリが存在する行を探します。
詳細については、以下を参照してください。