Cassandra ドキュメント

バージョン

プレリリース版のドキュメントを表示しています。

ストレージ接続インデックス (SAI) の使用

SAIインデックスの作成

SAIインデックスを作成するには、インデックス名、テーブル名、およびインデックスを作成する列の列名を定義する必要があります。

単純なSAIインデックスを作成するには

CREATE INDEX lastname_sai_idx ON cycling.cyclist_semi_pro (lastname)
USING 'sai'
WITH OPTIONS = {'case_sensitive': 'false', 'normalize': 'true', 'ascii': 'true'};

CREATE INDEX age_sai_idx ON cycling.cyclist_semi_pro (age)
USING 'sai';

CREATE INDEX country_sai_idx ON cycling.cyclist_semi_pro (country)
USING 'sai'
WITH OPTIONS = {'case_sensitive': 'false', 'normalize': 'true', 'ascii': 'true'};

CREATE INDEX registration_sai_idx ON cycling.cyclist_semi_pro (registration)
USING 'sai';

ほとんどのSAIインデックスでは、列名は、USING 'sai'も使用するCREATE INDEXステートメントで定義されます。SAIインデックスオプションは、WITH OPTIONS句で定義されます。case_sensitiveオプションは、大文字と小文字を区別しない検索を許可するためにfalseに設定されています。normalizeオプションは、Unicode文字の正規化された検索を許可するためにtrueに設定されています。ascii_onlyオプションは、ASCII文字に制限された検索を許可するためにtrueに設定されています。

mapコレクションデータ型は、以下の例に示すように、1つの例外です。

パーティションキーのSAIエラー

SAIインデックスは、プライマリインデックスがすでに存在し、クエリに使用されているため、パーティションキーに作成することはできません。パーティションキー列にSAIを作成しようとすると、エラーが返されます

  • CQL

  • 結果

CREATE INDEX ON demo2.person_id_name_primarykey (id)
  USING 'sai';
InvalidRequest: Error from server: code=2200 [Invalid query] message="Cannot create secondary index on the only partition key column id"

SAIインデックス内のmapコレクション

マップコレクションは、他のSAIインデックスとは異なる形式を持っています

// Create an index on a map key to find all cyclist/team combos for a year
// tag::keysidx[]
CREATE INDEX IF NOT EXISTS team_year_keys_idx
ON cycling.cyclist_teams ( KEYS (teams) );
// end::keysidx[]

// Create an index on a map key to find all cyclist/team combos for a year
// tag::valuesidx[]
CREATE INDEX IF NOT EXISTS team_year_values_idx
ON cycling.cyclist_teams ( VALUES (teams) );
// end::valuesidx[]

// Create an index on a map key to find all cyclist/team combos for a year
// tag::entriesidx[]
CREATE INDEX IF NOT EXISTS team_year_entries_idx
ON cycling.cyclist_teams ( ENTRIES (teams) );
// end::entriesidx[]

この例では、次のテーブルを使用します

CREATE TABLE IF NOT EXISTS cycling.comments_vs (
  record_id timeuuid,
  id uuid,
  commenter text,
  comment text,
  comment_vector VECTOR <FLOAT, 5>,
  created_at timestamp,
  PRIMARY KEY (id, created_at)
)
WITH CLUSTERING ORDER BY (created_at DESC);

comment_vectorに特定の類似度関数が設定されているかどうかを確認するには、similarity-functionオプションを、サポートされている類似度関数(DOT_PRODUCT、COSINE、またはEUCLIDEAN)のいずれかに設定します。デフォルトの類似度関数はCOSINEです。

このインデックスは、類似度関数がDOT_PRODUCTに設定されたcomment_vector列にインデックスを作成します

CREATE INDEX sim_comments_idx
    ON cycling.comments_vs (comment_vector)
    USING 'sai'
    WITH OPTIONS = { 'similarity_function': 'DOT_PRODUCT'};

その他のリソース

SAIインデックスの作成の詳細については、CREATE CUSTOM INDEXを参照してください。

SAIインデックスの変更

SAIインデックスは変更できません。SAIインデックスを変更する必要がある場合は、現在のインデックスを削除し、新しいインデックスを作成して、サイクリングを再構築する必要があります。

  1. インデックスの削除

    DROP INDEX IF EXISTS cycling.lastname_sai_idx;
  2. 新しいインデックスの作成

    CREATE INDEX lastname_sai_idx ON cycling.cyclist_semi_pro (lastname)
    USING 'sai'
    WITH OPTIONS = {'case_sensitive': 'false', 'normalize': 'true', 'ascii': 'true'};
    
    CREATE INDEX age_sai_idx ON cycling.cyclist_semi_pro (age)
    USING 'sai';
    
    CREATE INDEX country_sai_idx ON cycling.cyclist_semi_pro (country)
    USING 'sai'
    WITH OPTIONS = {'case_sensitive': 'false', 'normalize': 'true', 'ascii': 'true'};
    
    CREATE INDEX registration_sai_idx ON cycling.cyclist_semi_pro (registration)
    USING 'sai';

SAIインデックスの削除

SAIインデックスは削除(削除)できます。

SAIインデックスを削除するには

DROP INDEX IF EXISTS cycling.lastname_sai_idx;

このコマンドは結果を返しません。

SAIを使用したクエリ

SAIクイックスタートは、非プライマリキー列に基づいて複数のインデックスを定義すること(非常に便利な機能)のみに焦点を当てています。さまざまな定義のSAIインデックスを持つテーブルでクエリを実行する方法の例を使用して、他のオプションを調べてみましょう。

SAIはSELECTクエリのみをサポートし、UPDATEまたはDELETEクエリはサポートしません。

この例では、次のテーブルとインデックスを使用します

CREATE TABLE IF NOT EXISTS cycling.comments_vs (
  record_id timeuuid,
  id uuid,
  commenter text,
  comment text,
  comment_vector VECTOR <FLOAT, 5>,
  created_at timestamp,
  PRIMARY KEY (id, created_at)
)
WITH CLUSTERING ORDER BY (created_at DESC);
CREATE INDEX IF NOT EXISTS ann_index
  ON cycling.comments_vs(comment_vector) USING 'sai';

CQLでベクトルデータをクエリする

ベクトル検索を使用してデータをクエリするには、SELECTクエリを使用します

  • CQL

  • 結果

SELECT * FROM cycling.comments_vs
    ORDER BY comment_vector ANN OF [0.15, 0.1, 0.1, 0.35, 0.55]
    LIMIT 3;
 id                                   | created_at                      | comment                                | comment_vector               | commenter | record_id
--------------------------------------+---------------------------------+----------------------------------------+------------------------------+-----------+--------------------------------------
 e7ae5cf3-d358-4d99-b900-85902fda9bb0 | 2017-04-01 14:33:02.160000+0000 | LATE RIDERS SHOULD NOT DELAY THE START | [0.9, 0.54, 0.12, 0.1, 0.95] |      Alex | 616e77e0-22a2-11ee-b99d-1f350647414a
 c7fceba0-c141-4207-9494-a29f9809de6f | 2017-02-17 08:43:20.234000+0000 |      Glad you ran the race in the rain | [0.3, 0.34, 0.2, 0.78, 0.25] |       Amy | 6170c1d0-22a2-11ee-b99d-1f350647414a
 c7fceba0-c141-4207-9494-a29f9809de6f | 2017-04-01 13:43:08.030000+0000 |                Last climb was a killer |   [0.3, 0.75, 0.2, 0.2, 0.5] |       Amy | 62105d30-22a2-11ee-b99d-1f350647414a

制限は1,000以下でなければなりません。

結果を右にスクロールすると、クエリに使用された埋め込みに最もよく一致するテーブルのコメントが表示されます。

列の単一インデックスの一致

この例では、次のテーブルとインデックスを使用します

CREATE TABLE IF NOT EXISTS cycling.comments_vs (
  record_id timeuuid,
  id uuid,
  commenter text,
  comment text,
  comment_vector VECTOR <FLOAT, 5>,
  created_at timestamp,
  PRIMARY KEY (id, created_at)
)
WITH CLUSTERING ORDER BY (created_at DESC);
CREATE INDEX commenter_idx
    ON cycling.comments_vs (commenter)
    USING 'sai';
CREATE INDEX created_at_idx
    ON cycling.comments_vs (created_at)
    USING 'sai';
CREATE INDEX ann_index
    ON cycling.comments_vs (comment_vector)
    USING 'sai';

commenterはこのテーブルのパーティションキーではないため、クエリするにはインデックスが必要です。

その列の一致をクエリします

  • クエリ

  • 結果

    SELECT * FROM cycling.comments_vs
        WHERE commenter = 'Alex';
 id                                   | created_at                      | comment                                | comment_vector               | commenter | record_id
--------------------------------------+---------------------------------+----------------------------------------+------------------------------+-----------+--------------------------------------
 e7ae5cf3-d358-4d99-b900-85902fda9bb0 | 2017-04-01 14:33:02.160000+0000 | LATE RIDERS SHOULD NOT DELAY THE START | [0.9, 0.54, 0.12, 0.1, 0.95] |      Alex | 6d0cdaa0-272b-11ee-859f-b9098002fcac
 e7ae5cf3-d358-4d99-b900-85902fda9bb0 | 2017-03-21 21:11:09.999000+0000 |      Second rest stop was out of water | [0.99, 0.5, 0.99, 0.1, 0.34] |      Alex | 6d0b7b10-272b-11ee-859f-b9098002fcac
インデックスでの失敗

インデックスを作成する前にこのクエリを試行すると、エラーが発生することに注意してください

  • クエリ

  • 結果

    SELECT * FROM cycling.comments_vs
        WHERE commenter = 'Alex';
InvalidRequest: Error from server: code=2200
[Invalid query] message="Cannot execute this query as it might involve data filtering and thus may have unpredictable performance.
If you want to execute this query despite the performance unpredictability, use ALLOW FILTERING"

オプション付きの列の単一インデックス一致

この例では、次のテーブルとインデックスを使用します

CREATE TABLE IF NOT EXISTS cycling.comments_vs (
  record_id timeuuid,
  id uuid,
  commenter text,
  comment text,
  comment_vector VECTOR <FLOAT, 5>,
  created_at timestamp,
  PRIMARY KEY (id, created_at)
)
WITH CLUSTERING ORDER BY (created_at DESC);
CREATE INDEX commenter_cs_idx ON cycling.comments_vs (commenter)
USING 'sai'
WITH OPTIONS = {'case_sensitive': 'true', 'normalize': 'true', 'ascii': 'true'};

大文字と小文字の区別

commenterはこのテーブルのパーティションキーではないため、クエリするにはインデックスが必要です。commenterを大文字と小文字を区別する値としてチェックする場合は、case_sensitiveオプションをtrueに設定できます。

クエリで不適切に大文字と小文字を区別する値を使用した場合、結果は返されないことに注意してください

  • クエリ

  • 結果

SELECT * FROM comments_vs WHERE commenter ='alex';
 id | created_at | comment | comment_vector | commenter | record_id
----+------------+---------+----------------+-----------+-----------

(0 rows)

サイクリストの名前の大文字と小文字をインデックスの大文字と小文字と一致するように切り替えると、クエリは成功します

  • クエリ

  • 結果

SELECT comment,commenter FROM comments_vs WHERE commenter ='Alex';
 comment                                | commenter
----------------------------------------+-----------
 LATE RIDERS SHOULD NOT DELAY THE START |      Alex
      Second rest stop was out of water |      Alex
(2 rows)

複合パーティションキー列のインデックス一致

この例では、次のテーブルとインデックスを使用します

CREATE TABLE IF NOT EXISTS cycling.rank_by_year_and_name (
  race_year int,
  race_name text,
  cyclist_name text,
  rank int,
  PRIMARY KEY ((race_year, race_name), rank)
);
CREATE INDEX race_name_idx
    ON cycling.rank_by_year_and_name (race_name)
    USING 'sai';
CREATE INDEX race_year_idx
    ON cycling.rank_by_year_and_name (race_year)
    USING 'sai';

複合パーティションキーは、テーブル内の複数の列によって定義されたパーティションを持ちます。通常、WHERE句でテーブルをクエリするには、パーティションキー内のすべての列を指定する必要があります。ただし、SAIインデックスを使用すると、テーブルの複合パーティションキー内の単一の列を使用してインデックスを定義できます。1つの列に基づいてクエリを実行する必要がある場合は、複合パーティションキーの各列にSAIインデックスを作成できます。

SAIインデックスを使用すると、非効率的なALLOW FILTERINGディレクティブを使用せずにテーブルをクエリすることもできます。ALLOW FILTERINGディレクティブでは、テーブル内のすべてのパーティションをスキャンする必要があるため、パフォーマンスが低下します。

race_year列とrace_name列は、cycling.rank_by_year_and_nameテーブルの複合パーティションキーを構成します。

race_nameの一致をクエリします

  • クエリ

  • 結果

    SELECT * FROM cycling.rank_by_year_and_name
        WHERE race_name = 'Tour of Japan - Stage 4 - Minami > Shinshu';
 race_year | race_name                                  | rank | cyclist_name
-----------+--------------------------------------------+------+----------------------
      2014 | Tour of Japan - Stage 4 - Minami > Shinshu |    1 |        Daniel MARTIN
      2014 | Tour of Japan - Stage 4 - Minami > Shinshu |    2 | Johan Esteban CHAVES
      2014 | Tour of Japan - Stage 4 - Minami > Shinshu |    3 |      Benjamin PRADES
      2015 | Tour of Japan - Stage 4 - Minami > Shinshu |    1 |      Benjamin PRADES
      2015 | Tour of Japan - Stage 4 - Minami > Shinshu |    2 |          Adam PHELAN
      2015 | Tour of Japan - Stage 4 - Minami > Shinshu |    3 |         Thomas LEBAS

race_yearの一致をクエリします

  • クエリ

  • 結果

    SELECT * FROM cycling.rank_by_year_and_name
        WHERE race_year = 2014;
 race_year | race_name                                  | rank | cyclist_name
-----------+--------------------------------------------+------+----------------------
      2014 |                        4th Tour of Beijing |    1 |    Phillippe GILBERT
      2014 |                        4th Tour of Beijing |    2 |        Daniel MARTIN
      2014 |                        4th Tour of Beijing |    3 | Johan Esteban CHAVES
      2014 | Tour of Japan - Stage 4 - Minami > Shinshu |    1 |        Daniel MARTIN
      2014 | Tour of Japan - Stage 4 - Minami > Shinshu |    2 | Johan Esteban CHAVES
      2014 | Tour of Japan - Stage 4 - Minami > Shinshu |    3 |      Benjamin PRADES

ANDで一致する複数のインデックス

この例では、次のテーブルとインデックスを使用します

CREATE TABLE IF NOT EXISTS cycling.comments_vs (
  record_id timeuuid,
  id uuid,
  commenter text,
  comment text,
  comment_vector VECTOR <FLOAT, 5>,
  created_at timestamp,
  PRIMARY KEY (id, created_at)
)
WITH CLUSTERING ORDER BY (created_at DESC);
CREATE INDEX commenter_idx
    ON cycling.comments_vs (commenter)
    USING 'sai';
CREATE INDEX created_at_idx
    ON cycling.comments_vs (created_at)
    USING 'sai';
CREATE INDEX ann_index
    ON cycling.comments_vs (comment_vector)
    USING 'sai';

複数の列の一致をクエリする方法を示すために、テーブルにいくつかのインデックスが作成されます。

複数の列の一致をクエリし、両方の列が一致する必要があります

  • クエリ

  • 結果

SELECT * FROM cycling.comments_vs
    WHERE
    created_at='2017-03-21 21:11:09.999000+0000'
    AND commenter = 'Alex';
 id                                   | created_at                      | comment                           | comment_vector               | commenter | record_id
--------------------------------------+---------------------------------+-----------------------------------+------------------------------+-----------+--------------------------------------
 e7ae5cf3-d358-4d99-b900-85902fda9bb0 | 2017-03-21 21:11:09.999000+0000 | Second rest stop was out of water | [0.99, 0.5, 0.99, 0.1, 0.34] |      Alex | 6d0b7b10-272b-11ee-859f-b9098002fcac

ORで一致する複数のインデックス

この例では、次のテーブルとインデックスを使用します

CREATE TABLE IF NOT EXISTS cycling.comments_vs (
  record_id timeuuid,
  id uuid,
  commenter text,
  comment text,
  comment_vector VECTOR <FLOAT, 5>,
  created_at timestamp,
  PRIMARY KEY (id, created_at)
)
WITH CLUSTERING ORDER BY (created_at DESC);
CREATE INDEX commenter_idx
    ON cycling.comments_vs (commenter)
    USING 'sai';
CREATE INDEX created_at_idx
    ON cycling.comments_vs (created_at)
    USING 'sai';
CREATE INDEX ann_index
    ON cycling.comments_vs (comment_vector)
    USING 'sai';

複数の列の一致をクエリする方法を示すために、テーブルにいくつかのインデックスが作成されます。

1つの列または他の列の一致をクエリします

  • クエリ

  • 結果

SELECT * FROM cycling.comments_vs
    WHERE
    created_at='2017-03-21 21:11:09.999000+0000'
    OR created_at='2017-03-22 01:16:59.001000+0000';
 id                                   | created_at                      | comment                           | comment_vector               | commenter | record_id
--------------------------------------+---------------------------------+-----------------------------------+------------------------------+-----------+--------------------------------------
 e7ae5cf3-d358-4d99-b900-85902fda9bb0 | 2017-03-21 21:11:09.999000+0000 | Second rest stop was out of water | [0.99, 0.5, 0.99, 0.1, 0.34] |      Alex | 6d0b7b10-272b-11ee-859f-b9098002fcac
 c7fceba0-c141-4207-9494-a29f9809de6f | 2017-03-22 01:16:59.001000+0000 |     Great snacks at all reststops |  [0.1, 0.4, 0.1, 0.52, 0.09] |       Amy | 6d0fc0d0-272b-11ee-859f-b9098002fcac

INで一致する複数のインデックス

この例では、次のテーブルとインデックスを使用します

CREATE TABLE IF NOT EXISTS cycling.comments_vs (
  record_id timeuuid,
  id uuid,
  commenter text,
  comment text,
  comment_vector VECTOR <FLOAT, 5>,
  created_at timestamp,
  PRIMARY KEY (id, created_at)
)
WITH CLUSTERING ORDER BY (created_at DESC);
CREATE INDEX commenter_idx
    ON cycling.comments_vs (commenter)
    USING 'sai';
CREATE INDEX created_at_idx
    ON cycling.comments_vs (created_at)
    USING 'sai';
CREATE INDEX ann_index
    ON cycling.comments_vs (comment_vector)
    USING 'sai';

複数の列の一致をクエリする方法を示すために、テーブルにいくつかのインデックスが作成されます。

値のリスト内の列値と一致するクエリ

  • クエリ

  • 結果

SELECT * FROM cycling.comments_vs
    WHERE created_at IN
    ('2017-03-21 21:11:09.999000+0000'
    ,'2017-03-22 01:16:59.001000+0000');
 id                                   | created_at                      | comment                           | comment_vector               | commenter | record_id
--------------------------------------+---------------------------------+-----------------------------------+------------------------------+-----------+--------------------------------------
 e7ae5cf3-d358-4d99-b900-85902fda9bb0 | 2017-03-21 21:11:09.999000+0000 | Second rest stop was out of water | [0.99, 0.5, 0.99, 0.1, 0.34] |      Alex | 6d0b7b10-272b-11ee-859f-b9098002fcac
 c7fceba0-c141-4207-9494-a29f9809de6f | 2017-03-22 01:16:59.001000+0000 |     Great snacks at all reststops |  [0.1, 0.4, 0.1, 0.52, 0.09] |       Amy | 6d0fc0d0-272b-11ee-859f-b9098002fcac

ユーザー定義型

SAIは、ユーザー定義型(UDT)またはUDTのリストのいずれかをインデックス化できます。この例では、UDTのリストをインデックス化する方法を示します。

この例では、次のユーザー定義型(UDT)、テーブル、およびインデックスを使用します

CREATE TYPE IF NOT EXISTS cycling.race (
  race_title text,
  race_date timestamp,
  race_time text
);
CREATE TABLE IF NOT EXISTS cycling.cyclist_races (
  id UUID PRIMARY KEY,
  lastname text,
  firstname text,
  races list<FROZEN <race>>
);
CREATE INDEX races_idx
    ON cycling.cyclist_races (races)
    USING 'sai';

cycling.cyclist_racesテーブルのUDTリスト型カラムracesにインデックスが作成されます。

リスト型カラムracesに対してCONTAINSを使用したクエリ

  • CQL

  • 結果

SELECT * FROM cycling.cyclist_races
    WHERE races CONTAINS {
       race_title:'Rabobank 7-Dorpenomloop Aalburg',
       race_date:'2015-05-09',
       race_time:'02:58:33'};
 id                                   | firstname | lastname | races
--------------------------------------+-----------+----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 5b6962dd-3f90-4c93-8f61-eabfa4a803e2 |  Marianne |      VOS | [{race_title: 'Rabobank 7-Dorpenomloop Aalburg', race_date: '2015-05-09 00:00:00.000000+0000', race_time: '02:58:33'}, {race_title: 'Ronde van Gelderland', race_date: '2015-04-19 00:00:00.000000+0000', race_time: '03:22:23'}]

(1 rows)

コレクションを使用したSAIインデックス

SAIはmaplistset型のコレクションをサポートします。コレクションを使用すると、データをグループ化してカラムに一緒に保存できます。

リレーショナルデータベースでは、ユーザーの複数のメールアドレスなどのグループ化は、(たとえば)userテーブルとemailテーブル間の多対一の結合関係を介して実現されます。Apache Cassandraは、userテーブルのコレクションカラムにユーザーのメールアドレスを格納することにより、2つのテーブル間の結合を回避します。各コレクションは、保持されるデータのデータ型を指定します。

コレクションは、コレクションストレージのデータが制限されている場合に適しています。メッセージ送信や毎秒登録されるセンサーイベントのように、データの成長が無限である可能性がある場合は、コレクションを使用しないでください。代わりに、クラスタリングカラムにデータが格納される複合プライマリキーを持つテーブルを使用してください。

SAIインデックスを持つデータベーステーブルのCQLクエリでは、CONTAINS句がサポートされており、以下のものに固有です。

  • keysvalues、およびentriesを持つSAIコレクションマップ

  • listおよびset型のSAIコレクション

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テーブルのset型カラムteamsにインデックスが作成されます。

set型カラムteamsに対してCONTAINSを使用したクエリ

  • CQL

  • 結果

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テーブルのlist型カラムeventsにインデックスが作成されます。

list型カラムeventsに対してCONTAINSを使用したクエリ

  • CQL

  • 結果

SELECT * FROM cycling.upcoming_calendar
   WHERE events CONTAINS 'Criterium du Dauphine';
 year | month | events
------+-------+-----------------------------------------------
 2015 |     6 | ['Criterium du Dauphine', 'Tour de Sui\nsse']

わずかに複雑なクエリでは、特定のイベントを含む行または特定の日付の月の行を選択します。

  • CQL

  • 結果

SELECT * FROM cycling.upcoming_calendar
    WHERE events CONTAINS 'Criterium du Dauphine'
          OR month = 7;
 year | month | events
------+-------+-----------------------------------------------
 2015 |     6 | ['Criterium du Dauphine', 'Tour de Sui\nsse']
 2015 |     7 |                            ['Tour de France']

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テーブルのmap型カラムteamsに作成されたインデックスは、カラムデータのキー、値、および完全なエントリを対象とします。

map型カラムteamsからKEYSを使用したクエリ

  • CQL

  • 結果

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'}

CONTAINSキーワードのみが含まれていることに注意して、map型カラムteamsから値をクエリします。

  • CQL

  • 結果

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句の違いに注意して、map型カラムteamsからエントリをクエリします。

  • CQL

  • 結果

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'}

この例では、map型カラムteamsに2つのエントリが存在する行を探します。

詳細については、以下を参照してください。