CREATE CUSTOM INDEX
現在サポートされているデータベースは Cassandra 5.0 のみです。
ストレージ接続インデックス (SAI) インデックスを作成します。同じデータベーステーブルに複数のセカンダリインデックスを作成できます。各 SAI インデックスは、テーブル内の任意の列に基づいて作成できます。次のデータ型を除くすべての列データ型が SAI インデックスでサポートされています。
-
カウンター
-
地理空間型: `PointType`、`LineStringType`、`PolygonType`
-
フリーズされていないユーザー定義型 (UDT)
ただし、テーブルの複合パーティションキー(つまり、複数の列で構成されるパーティションキー)内の列の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 ステートメントのリテラル文字列を囲む必要があります。大文字を保持するには、単一引用符を使用します。 |
|
マップコレクション。中括弧 (`{}`) は、マップコレクションまたはキー値ペアを囲みます。コロンはキーと値を区切ります。 |
集合、リスト、マップ、またはタプル。山括弧 (`<>`) は、集合、リスト、マップ、またはタプル内のデータ型を囲みます。データ型をコンマで区切ります。 |
|
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
型のリストデータを入力します。
|
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
型の集合データを入力します。
|
リストからのCONTAINS
を使用したクエリ例