Cassandra ドキュメント

バージョン

あなたはプレリリース版のドキュメントを閲覧しています。

CREATE CUSTOM INDEX

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

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

  • counter

  • 非フリーズユーザー定義型 (UDT)

1つの例外

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

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

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

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

構文

BNF定義

index_name::= re('[a-zA-Z_0-9]+')
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 'StorageAttachedIndex'
  [ WITH OPTIONS = { <option_map> } ] ;
構文の凡例
凡例
構文規則 説明

UPPERCASE

リテラルキーワード。

Lowercase

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

< >

可変値。ユーザー定義の値に置き換えます。

[]

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

( )

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

|

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

...

反復可能。省略記号(...)は、構文要素を必要な回数だけ繰り返すことができることを示します。

'<Literal string>'

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

{ <key> : <value> }

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

<datatype2

セット、リスト、マップ、またはタプル。山かっこ(< >)は、セット、リスト、マップ、またはタプルのデータ型を囲みます。データ型をコンマで区切ります。

<cql_statement>;

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

[--]

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

' <<schema\> ... </schema\>> '

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

@<xml_entity>='<xml_entity_type>'

検索CQLのみ:スキーマおよびsolrConfigファイルでXML要素を上書きするエンティティとリテラル値を識別します。

index_name

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

column_name

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

map_name

コレクションで使用され、CREATE TABLE…​map(<map_name>)で指定されたmap_nameの識別子。コレクションタイプlistsetには、通常の列構文が適用されます。

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はBasic Latin Unicodeブロック(最初の127のASCII文字)にないアルファベット、数字、および記号文字を、存在する場合はASCII同等物に変換します。たとえば、このオプションはàをaに変更します。デフォルト:false

similarity_function

ベクトル検索は、関連する一致を特定するためにベクトル間の類似性または距離を計算することに依存しています。類似性関数は、2つのベクトル間の類似性を計算するために使用されます。有効なオプションは、EUCLIDEAN、DOT_PRODUCT、COSINEです。デフォルト:COSINE

クエリ演算子

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

  • 数値: =<>>=ANDORIN

  • 文字列: =CONTAINSCONTAINS KEYANDORIN

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インデックスで複数のタイプ(keysvaluesentries)のコレクションマップを使用する方法を示しています。関連情報については、コレクションの作成マップタイプの使用を参照してください。

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

まず、キースペースを作成します

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

次に、キースペースを使用します

USE demo3;

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

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

同じmap列に複数のSAIインデックスを作成します。各インデックスは、KEYSVALUES、およびENTRIESを使用します。

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

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

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 句は以下に対してサポートされており、以下に固有であることに注意してください。

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

  • list および set 型を持つ SAI コレクション

リスト型およびセット型を使用する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 CUSTOM INDEX ON calendar(years) USING 'StorageAttachedIndex';

デモ目的のために、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 CUSTOM INDEX ON calendar2(years) USING 'StorageAttachedIndex';

ここでもデモ目的のために、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)