Cassandra ドキュメント

バージョン

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

CREATE CUSTOM INDEX

現在サポートされているデータベースは Cassandra 5.0 のみです。

ストレージ接続インデックス (SAI) インデックスを作成します。同じデータベーステーブルに複数のセカンダリインデックスを作成できます。各 SAI インデックスは、テーブル内の任意の列に基づいて作成できます。次のデータ型を除くすべての列データ型が SAI インデックスでサポートされています。

  • カウンター

  • 地理空間型: `PointType`、`LineStringType`、`PolygonType`

  • フリーズされていないユーザー定義型 (UDT)

例外

パーティションキーが1列のみで構成されている場合、パーティションキーに基づいて SAI インデックスを定義することはできません。この場合に SAI インデックスを作成しようとすると、SAI はエラーメッセージを発行します。

ただし、テーブルの複合パーティションキー(つまり、複数の列で構成されるパーティションキー)内の列の1つに SAI インデックスを定義できます。これらの列の1つに基づいてクエリを実行する必要がある場合は、SAI インデックスが便利なオプションです。必要に応じて、複合パーティションキー内の各列に SAI インデックスを定義できます。

データベーステーブル内の任意の列(上記のルールに従う)に基づいて 1 つ以上の SAI インデックスを定義することで、インデックス付きの列を使用して結果をフィルタリングする高性能クエリを実行できるようになります。

SAI セクションを参照してください。

概要

CREATE [CUSTOM] INDEX [ IF NOT EXISTS ] [ <index_name> ]
  ON [ <keyspace_name>.]<table_name> (<column_name>)
    | [ (KEYS(<map_name>)) ]
    | [ (VALUES(<map_name>)) ]
    | [ (ENTRIES(<map_name>)) ]
  USING 'sai'
  [ WITH OPTIONS = { <option_map> } ] ;
構文凡例
凡例
構文規則 説明

大文字

リテラルキーワード。

小文字

リテラルではありません。

< >

変数値。ユーザー定義値で置き換えます。

[]

オプション。角括弧 (`[]`) はオプションのコマンド引数を囲みます。角括弧は入力しないでください。

( )

グループ。括弧 (`()`) は選択するグループを示します。括弧は入力しないでください。

|

または。縦線 (`|`) は代替要素を区切ります。要素のいずれかを入力します。縦線は入力しないでください。

...

繰り返し可能。省略記号 (`...`) は、構文要素を必要に応じて繰り返し入力できることを示します。

`'<リテラル文字列>'`

単一引用符 (`) は、CQL ステートメントのリテラル文字列を囲む必要があります。大文字を保持するには、単一引用符を使用します。

`{ <キー> : <値> }`

マップコレクション。中括弧 (`{}`) は、マップコレクションまたはキー値ペアを囲みます。コロンはキーと値を区切ります。

<データ型2

集合、リスト、マップ、またはタプル。山括弧 (`<>`) は、集合、リスト、マップ、またはタプル内のデータ型を囲みます。データ型をコンマで区切ります。

;`

CQL ステートメントの終了。セミコロン (`;`) はすべての CQL ステートメントを終了します。

[--]

コマンドラインオプションとコマンド引数を 2 つのハイフン (`--`) で区切ります。この構文は、引数がコマンドラインオプションと間違われる可能性がある場合に便利です。

`'<<スキーマ>> ... >'`

CQL 検索のみ: 単一引用符 (`) は、XML スキーマ宣言全体を囲みます。

`@=''`

CQL 検索のみ: スキーマファイルと solrConfig ファイル内の XML 要素を上書きするエンティティとリテラル値を特定します。

index_name

インデックスのオプションの識別子。名前を指定しない場合は、デフォルトの `__idx` が使用されます。特殊文字を使用するか、大文字を保持するには、引用符で囲みます。

column_name

SAI インデックスが定義されているテーブル列の名前。SAI は、名前の中に英数字とアンダースコアのみを許可します。他の文字を含む列名にインデックスを定義しようとすると、SAI は `InvalidRequestException` を返し、インデックスを作成しません。

map_name

コレクションで使用される、`CREATE TABLE` … `map()` で指定された `map_name` の識別子。コレクション型 `list` と `set` には、通常の列構文が適用されます。

option_map

オプションを JSON シンプル形式で定義します。

オプション 説明

case_sensitive

一致する文字列値の大文字と小文字を無視します。デフォルト: `true`。

normalize

`true` に設定すると、インデックス付きの文字列に Unicode 正規化 を実行します。SAI は、正規化形式 C (NFC) Unicode をサポートしています。`true` に設定すると、SAI は特定の Unicode 文字のさまざまなバージョンを単一のバージョンに正規化し、インデックス内のすべてのマークと記号を保持します。たとえば、SAI は文字 Å (U+212B) を Å (U+00C5) に変更します。

実装が文字列を正規化された形式で保持する場合、等価な文字列は一意のバイナリ表現を持ちます。Unicode 標準附属書 #15、Unicode 正規化形式を参照してください。

デフォルト: `false`。

ascii

`true` に設定すると、SAI は、基本ラテン Unicode ブロック(最初の 127 個の ASCII 文字)にないアルファベット、数字、記号の文字を、存在する場合は ASCII 同等物に変換します。たとえば、このオプションは à を a に変更します。デフォルト: `false`。

クエリ演算子

SAI は、SAI インデックスを持つテーブルに対して次のクエリ演算子をサポートしています。

  • 数値: `=`、`<`、`>`、`<=`、`>=`、`AND`、`OR`、`IN`

  • 文字列: `=`、`CONTAINS`、`CONTAINS KEY`、`AND`、`OR`、`IN`

SAI は、SAI インデックスを持つテーブルに対して次のクエリ演算子をサポートしていません。

  • 文字列または数値: `LIKE`

これらの例では、SAI クイックスタートで説明されている `cycling.cyclist_semi_pro` テーブルの 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 インデックスを使用して `cycling.cyclist_semi_pro` のデータを見つけるサンプルクエリについては、CQL クエリを送信するを参照してください。SAI 列インデックスとクエリ規則を調べるも参照してください。

キー、値、エントリを含む SAI コレクションマップの例

次の例では、SAI インデックスで複数の型(`keys`、`values`、`entries`)のコレクションマップを使用する方法を示します。関連情報については、コレクションの作成マップ型の使用を参照してください。

このトピックの リスト型とセット型 の SAI コレクションの例も参照してください。

まず、keyspace を作成します

CREATE KEYSPACE demo3 WITH REPLICATION =
       {'class': 'SimpleStrategy', 'replication_factor': '1'};

次に、keyspace を使用します

USE demo3;

`text_map` という名前のコレクションマップを含む `audit` テーブルを作成します

CREATE TABLE audit ( id int PRIMARY KEY , text_map map<text, text>);

`KEYS`、`VALUES`、`ENTRIES` をそれぞれ使用して、同じ `map` 列に複数の SAI インデックスを作成します。

異なるマップ型を持つ複数の SAI インデックスを **同じ列に** 作成するには、Cassandra 5.0 以降が必要です。

CREATE INDEX ON audit (KEYS(text_map)) USING 'sai';
CREATE INDEX ON audit (VALUES(text_map)) USING 'sai';
CREATE INDEX ON audit (ENTRIES(text_map)) USING 'sai';

いくつかのデータを入力します

INSERT INTO audit (id, text_map) values (1, {'Carlos':'Perotti', 'Marcel':'Silva'});
INSERT INTO audit (id, text_map) values (2, {'Giovani':'Pasi', 'Frances':'Giardello'});
INSERT INTO audit (id, text_map) values (3, {'Mark':'Pastore', 'Irene':'Cantona'});

すべてのデータにクエリを実行します

  • クエリ

  • 結果

SELECT * FROM audit;
 id | text_map
----+---------------------------------------------
  1 | {'Carlos': 'Perotti', 'Marcel': 'Silva'}
  2 | {'Frances': 'Giardello', 'Giovani': 'Pasi'}
  3 | {'Irene': 'Cantona', 'Mark': 'Pastore'}

(3 rows)

`map` 列内の特定のエントリに対する SAI インデックスを使用してクエリを実行します

  • クエリ

  • 結果

SELECT * FROM audit WHERE text_map['Irene'] = 'Cantona' AND text_map['Mark'] = 'Pastore';
 id | text_map
----+-----------------------------------------
  3 | {'Irene': 'Cantona', 'Mark': 'Pastore'}

(1 rows)

`CONTAINS KEY` を使用して `map` 列内の特定のキーに対する SAI インデックスを使用してクエリを実行します

  • クエリ

  • 結果

SELECT * FROM audit WHERE text_map CONTAINS KEY 'Giovani';
 id | text_map
----+---------------------------------------------
  2 | {'Frances': 'Giardello', 'Giovani': 'Pasi'}

(1 rows)

`CONTAINS` を使用して `map` 列内の特定の値に対する SAI インデックスを使用してクエリを実行します

  • クエリ

  • 結果

SELECT * FROM audit WHERE text_map CONTAINS 'Silva';
 id | text_map
----+------------------------------------------
  1 | {'Carlos': 'Perotti', 'Marcel': 'Silva'}

(1 rows)

SAI インデックスを使用する CQL クエリでは、`CONTAINS` 句は、次のようにサポートされ、特定のものになります。

  • SAI **コレクションマップ** (`keys`、`values`、`entries`)

  • SAI **コレクション** (`list` と `set` 型)

リスト型とセット型を持つ SAI コレクションの例

これらの例では、SAI インデックスで `list` 型と `set` 型のコレクションを使用する方法を示します。関連情報については、以下を参照してください。

CREATE KEYSPACE IF NOT EXISTS demo3 WITH REPLICATION =
       {'class': 'SimpleStrategy', 'replication_factor': '1'};
USE demo3;

リスト型の使用

`list` 型のコレクションを持つ `calendar` テーブルを作成します。

CREATE TABLE calendar (key int PRIMARY KEY, years list<int>);

コレクションの `years` 列を使用して SAI インデックスを作成します。

CREATE INDEX ON calendar(years) USING 'sai';

デモ目的で、yearsにランダムなint型のリストデータを入力します。

INSERTコマンドのリスト値に対する角括弧構文に注意してください。

INSERT INTO calendar (key, years) VALUES (0, [1990,1996]);
INSERT INTO calendar (key, years) VALUES (1, [2000,2010]);
INSERT INTO calendar (key, years) VALUES (2, [2001,1990]);

CONTAINSを使用したクエリ例

  • クエリ

  • 結果

SELECT * FROM calendar WHERE years CONTAINS 1990;
 key | years
-----+--------------
   0 | [1990, 1996]
   2 | [2001, 1990]
(2 rows)

この例では、years list<int>を使用してcalendarテーブルを作成しました。もちろん、years list<text>を使用してテーブルを作成し、例えば'string'値を挿入して、文字列でクエリを実行することもできます。

集合型の使用

今度は、set型の集合を持つcalendar2テーブルを作成します。

CREATE TABLE calendar2 (key int PRIMARY KEY, years set<int>);

集合のyears列を使用してSAIインデックスを作成します — 今回はcalendar2テーブルに対してです。

CREATE INDEX ON calendar2(years) USING 'sai';

デモ目的で、yearsにランダムなint型の集合データを入力します。

INSERTコマンドの集合値に対する波括弧構文に注意してください。

INSERT INTO calendar2 (key, years) VALUES (0, {1990,1996});
INSERT INTO calendar2 (key, years) VALUES (1, {2000,2010});
INSERT INTO calendar2 (key, years) VALUES (2, {2001,1990,2020});

リストからのCONTAINSを使用したクエリ例

  • クエリ

  • 結果

SELECT * FROM calendar2  WHERE years CONTAINS 1990;
 key | years
-----+--------------------
   0 |       {1990, 1996}
   2 | {1990, 2001, 2020}

(2 rows)