CREATE CUSTOM INDEX
現在、Cassandra 5.0 のみがサポートされているデータベースです。
ストレージアタッチインデックス(SAI)インデックスを作成します。同じデータベーステーブルに複数のセカンダリインデックスを作成でき、各SAIインデックスはテーブル内の任意の列に基づいています。次のものを除くすべての列データ型は、SAIインデックスでサポートされています。
-
counter
-
非フリーズユーザー定義型 (UDT)
ただし、テーブルの複合パーティションキー(つまり、複数の列で構成されるパーティションキー)のいずれかの列に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 |
リテラルではありません。 |
|
可変値。ユーザー定義の値に置き換えます。 |
|
オプション。角かっこ( |
|
グループ。括弧( |
|
または。縦棒( |
|
反復可能。省略記号( |
|
単一引用符( |
|
マップコレクション。中かっこ( |
セット、リスト、マップ、またはタプル。山かっこ( |
|
|
CQLステートメントの終了。セミコロン( |
|
コマンドラインオプションとコマンド引数を、2つのハイフン( |
|
検索CQLのみ:単一引用符( |
|
検索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
の識別子。コレクションタイプ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はBasic Latin Unicodeブロック(最初の127のASCII文字)にないアルファベット、数字、および記号文字を、存在する場合はASCII同等物に変換します。たとえば、このオプションはàをaに変更します。デフォルト:false
。similarity_function
ベクトル検索は、関連する一致を特定するためにベクトル間の類似性または距離を計算することに依存しています。類似性関数は、2つのベクトル間の類似性を計算するために使用されます。有効なオプションは、EUCLIDEAN、DOT_PRODUCT、COSINEです。デフォルト:
COSINE
クエリ演算子
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コレクションの例も参照してください。
まず、キースペースを作成します
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インデックスを作成します。各インデックスは、KEYS
、VALUES
、および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
句は以下に対してサポートされており、以下に固有であることに注意してください。
-
keys
、values
、および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
リストデータを挿入します。
リスト値の
|
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
セットデータを挿入します。
セット値の
|
リストからの CONTAINS
を使用したクエリの例