Cassandra 文件

版本

您正在檢視預發行版本的說明文件。

CREATE INDEX

為表格的單一欄位定義新的次要索引 (2i) 或儲存附加索引 (SAI)。

Apache Cassandra 支援在大部分欄位上建立次要索引或儲存附加索引,包括 PRIMARY KEY 的分割和叢集欄位、集合和靜態欄位。對於映射,您可以使用鍵、值或項目 (鍵值對) 進行索引。

除了下列項目外,所有欄位資料類型都支援 SAI 索引

  • 計數器

  • 非凍結使用者定義類型 (UDT)

一個例外

當分割鍵僅包含一欄位時,您無法根據分割鍵定義 SAI 索引。如果您嘗試在這種情況下建立 SAI 索引,SAI 會發出錯誤訊息。

另請參閱: CREATE CUSTOM INDEX 針對儲存附加索引 (SAI)、DROP INDEX

語法

BNF 定義

index_name::= re('[a-zA-Z_0-9]+')
CREATE INDEX [ IF NOT EXISTS ] <index_name>
  ON [<keyspace_name>.]<table_name>
  ( [ ( KEYS | FULL | ENTRIES ) ] <column_name>)
    //   | [ (KEYS(<map_name>)) ]
    // | [ (VALUES(<map_name>)) ]
    // | [ (ENTRIES(<map_name>)) ]
   [USING 'sai']
  [ WITH OPTIONS = { <option_map> } ];
語法圖例
圖例
語法慣例 說明

大寫

文字關鍵字。

小寫

非文字。

< >

變數值。替換為使用者定義的值。

[]

選用。方括號 ([]) 包圍選用命令引數。請勿輸入方括號。

( )

群組。括號 ( ( ) ) 識別一個群組以供選擇。請勿輸入括號。

|

或。直線 (|) 分隔替代元素。輸入任何一個元素。請勿輸入直線。

...

可重複。省略號 ( ... ) 表示您可以重複語法元素,次數不限。

'<文字字串>'

單引號 (') 標記必須包圍 CQL 陳述式中的文字字串。使用單引號保留大寫。

{ <金鑰> : <值> }

對應集合。大括號 ({ }) 包圍對應集合或金鑰值配對。冒號分隔金鑰和值。

<資料類型2

集合、清單、對應或元組。尖括號 ( < > ) 包圍集合、清單、對應或元組中的資料類型。使用逗號分隔資料類型。

<cql_陳述式>;

結束 CQL 陳述式。分號 (;) 終止所有 CQL 陳述式。

[--]

使用兩個連字號 ( -- ) 分隔命令列選項和命令引數。此語法在引數可能被誤認為命令列選項時很有用。

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

僅搜尋 CQL:單引號 (') 包圍整個 XML 架構宣告。

@<xml_實體>='<xml_實體類型>'

僅搜尋 CQL:識別實體和文字值以覆寫架構和 solrConfig 檔案中的 XML 元素。

必要參數

參數

說明

table_name

要建立索引的表格名稱。

column_name

要建立索引的欄位名稱。SAI 僅允許名稱中包含英數字元和底線。如果您嘗試針對包含其他字元的欄位名稱定義索引,SAI 會傳回 InvalidRequestException,且不會建立索引。

選用參數

參數

說明

index_name

索引名稱。使用引號包圍以使用特殊字元或保留大寫。如果未指定名稱,Apache Cassandra 會將索引命名為 <table_name>\_<column_name>\_idx

keyspace_name

包含要建立索引的表格的鍵空間名稱。如果未指定名稱,則使用目前的鍵空間。

map_name

集合 搭配使用,CREATE TABLE …​ map(<map_name>) 中指定的 map_name 識別碼。集合類型 listset 適用一般欄位語法。

option_map

以 JSON 簡易格式定義選項。

case_sensitive

比對字串值時忽略大小寫。預設值:true

normalize

設為 true 時,對索引字串執行 Unicode 正規化。SAI 支援 Unicode 正規化形式 C (NFC)。設為 true 時,SAI 會將給定 Unicode 字元的不同版本正規化為單一版本,保留索引中的所有標記和符號。例如,SAI 會將字元 Å (U+212B) 變更為 Å (U+00C5)。

當實作將字串保留在正規化形式時,等效字串會具有唯一的二進制表示。請參閱 Unicode 標準附錄 #15,Unicode 正規化形式

預設值:false

ascii

設為 true 時,SAI 會將不在基本拉丁 Unicode 區塊(前 127 個 ASCII 字元)中的字母、數字和符號字元轉換為等效的 ASCII 字元(如果存在)。例如,這個選項會將 à 變更為 a。預設值:false

similarity_function

向量搜尋仰賴計算向量之間的相似度或距離,以找出相關的比對。相似度函數用於計算兩個向量之間的相似度。有效選項為:EUCLIDEANDOT_PRODUCTCOSINE 預設值:COSINE

使用注意事項

如果欄位已包含資料,則會在執行此陳述式期間為其建立索引。建立索引後,當欄位中的資料變更時,索引會自動更新。

使用 CREATE INDEX 指令建立索引可能會影響效能。在建立索引之前,請了解 何時建立索引何時不建立索引

限制:不支援為計數器欄位建立索引。

SAI 索引

您可以在表格複合分區鍵中的一個欄位上定義 SAI 索引,也就是包含多個欄位的分區鍵。如果您需要根據其中一個欄位查詢,SAI 索引是一個有用的選項。事實上,您可以在複合分區鍵中的每個欄位上定義 SAI 索引,視需要而定。

在資料庫表格中的任何欄位上定義一個或多個 SAI 索引,讓查詢可以使用索引欄位來篩選結果。

SAI 查詢運算子

SAI 支援下列針對有 SAI 索引的表格的查詢運算子

  • 數字:=<>>=ANDORIN

  • 字串:=CONTAINSCONTAINS KEYANDORIN

SAI 不支援下列針對有 SAI 索引的表格的查詢運算子

  • 字串或數字:LIKE

請參閱 SAI 區段

範例

在分群欄位上建立 SAI 索引

定義一個有 複合分區鍵 的表格,然後在分群欄位上建立索引。

  • 建立表格

  • 建立索引

  • 選取查詢

  • 選取結果

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 IF NOT EXISTS rank_idx
ON cycling.rank_by_year_and_name (rank);
SELECT * FROM rank_by_year_and_name WHERE rank = 1;
 race_year | race_name                                  | rank | cyclist_name
-----------+--------------------------------------------+------+-------------------
      2014 |                        4th Tour of Beijing |    1 | Phillippe GILBERT
      2014 | Tour of Japan - Stage 4 - Minami > Shinshu |    1 |     Daniel MARTIN
      2015 |   Giro d'Italia - Stage 11 - Forli > Imola |    1 |     Ilnur ZAKARIN
      2015 | Tour of Japan - Stage 4 - Minami > Shinshu |    1 |   Benjamin PRADES

(4 rows)

在集合或清單中建立索引

在集合或清單欄位中建立索引,就像在其他欄位中建立索引一樣。在 CREATE INDEX 陳述式的結尾,用括號括住集合欄位的名稱。例如,將團隊集合新增到 cyclist_career_teams 表格,以索引團隊集合中的資料。

  • 建立表格

  • 建立索引

  • 選取查詢

  • 選取結果

CREATE TABLE IF NOT EXISTS cycling.cyclist_career_teams (
  id UUID PRIMARY KEY,
  lastname text,
  teams set<text>
);
CREATE INDEX IF NOT EXISTS teams_idx
ON cycling.cyclist_career_teams (teams);
SELECT * FROM cyclist_career_teams WHERE teams CONTAINS 'Rabobank-Liv Woman Cycling Team';
 id                                   | lastname        | teams
--------------------------------------+-----------------+------------------------------------------------------------------------------------------------------
 5b6962dd-3f90-4c93-8f61-eabfa4a803e2 |             VOS | {'Nederland bloeit', 'Rabobank Women Team', 'Rabobank-Liv Giant', 'Rabobank-Liv Woman Cycling Team'}
 1c9ebc13-1eab-4ad5-be87-dce433216d40 |           BRAND |   {'AA Drink - Leontien.nl', 'Leontien.nl', 'Rabobank-Liv Giant', 'Rabobank-Liv Woman Cycling Team'}
 e7cd5752-bc0d-4157-a80f-7523add8dbcd | VAN DER BREGGEN |                 {'Rabobank-Liv Woman Cycling Team', 'Sengers Ladies Cycling Team', 'Team Flexpoint'}

(3 rows)

在映射鍵上建立索引

您可以在 映射集合鍵 上建立索引。如果集合的映射值索引已存在,請在建立映射集合鍵索引前刪除該索引。假設一個 cyclist 表格包含此映射資料,其中 nation 是映射鍵,而 `Canada 是映射值`

{'nation':'CANADA' }

若要索引映射鍵,請在 CREATE INDEX 陳述式中使用 KEYS 關鍵字和巢狀括弧中的映射名稱。若要對表格執行 SELECT 查詢,請在 WHERE 子句中使用 CONTAINS KEY。此查詢傳回在 2015 年有參賽記錄的自行車隊。

  • 建立表格

  • 建立索引

  • SELECT 查詢

  • SELECT 結果

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) );
SELECT *
FROM cycling.cyclist_teams
WHERE teams CONTAINS KEY 2015;
 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 |                                                                                                                                   {2015: 'Rabobank-Liv Woman Cycling Team'}

(2 rows)

建立映射條目索引

您可以在映射條目上建立索引。ENTRIES 索引只能建立在沒有現有索引的表格映射欄位上。

若要索引集合條目,請在巢狀括弧中使用 ENTRIES 關鍵字和映射名稱。若要查詢表格中的映射條目,請使用包含映射名稱和值的 WHERE 子句。此查詢會找出年齡相同的自行車選手。

  • 建立表格

  • 建立索引

  • SELECT 查詢

  • SELECT 結果

CREATE TABLE IF NOT EXISTS cycling.birthday_list (
  cyclist_name text PRIMARY KEY,
  blist map<text, text>
);
CREATE INDEX IF NOT EXISTS blist_idx
ON cycling.birthday_list ( ENTRIES(blist) );
SELECT *
FROM cycling.birthday_list
WHERE blist[ 'age' ] = '23';
 cyclist_name     | blist
------------------+----------------------------------------------------------
   Claudio HEINEN | {'age': '23', 'bday': '27/07/1992', 'nation': 'GERMANY'}
 Laurence BOURQUE |  {'age': '23', 'bday': '27/07/1992', 'nation': 'CANADA'}

(2 rows)

使用相同的索引找出來自相同國家的自行車選手

  • 建立表格

  • 建立索引

  • SELECT 查詢

  • SELECT 結果

CREATE TABLE IF NOT EXISTS cycling.birthday_list (
  cyclist_name text PRIMARY KEY,
  blist map<text, text>
);
CREATE INDEX IF NOT EXISTS blist_idx
ON cycling.birthday_list ( ENTRIES(blist) );
SELECT *
FROM cycling.birthday_list
WHERE blist[ 'nation' ] = 'NETHERLANDS';
 cyclist_name  | blist
---------------+--------------------------------------------------------------
 Luc HAGENAARS | {'age': '28', 'bday': '27/07/1987', 'nation': 'NETHERLANDS'}
   Toine POELS | {'age': '52', 'bday': '27/07/1963', 'nation': 'NETHERLANDS'}

(2 rows)

建立映射值索引

若要建立映射值索引,請在巢狀括弧中使用 VALUES 關鍵字和映射名稱。若要查詢表格,請使用包含映射名稱和其所含值的 WHERE 子句。

  • 建立表格

  • 建立索引

  • SELECT 查詢

  • SELECT 結果

CREATE TABLE IF NOT EXISTS cycling.birthday_list (
  cyclist_name text PRIMARY KEY,
  blist map<text, text>
);
CREATE INDEX IF NOT EXISTS blist_values_idx
ON cycling.birthday_list ( VALUES(blist) );
SELECT *
FROM cycling.birthday_list
WHERE blist CONTAINS 'NETHERLANDS';
 cyclist_name  | blist
---------------+--------------------------------------------------------------
 Luc HAGENAARS | {'age': '28', 'bday': '27/07/1987', 'nation': 'NETHERLANDS'}
   Toine POELS | {'age': '52', 'bday': '27/07/1963', 'nation': 'NETHERLANDS'}

(2 rows)

建立凍結集合完整內容索引

您可以在完整的 FROZEN 集合上建立索引。FULL 索引可以建立在沒有現有索引的表格集合、清單或映射欄位上。

建立 FROZEN list 完整內容索引。此範例中的表格儲存自行車選手參加的職業比賽次數、環賽次數和經典賽次數。若要索引集合條目,請在巢狀括弧中使用 FULL 關鍵字和集合名稱。例如,索引凍結清單 rnumbers。若要查詢表格,請使用包含集合名稱和值的 WHERE 子句。

  • 建立資料表

  • 建立索引

  • SELECT 查詢

  • SELECT 結果

CREATE TABLE IF NOT EXISTS cycling.race_starts (
  cyclist_name text PRIMARY KEY,
  rnumbers FROZEN<LIST<int>>
);
CREATE INDEX IF NOT EXISTS rnumbers_idx
ON cycling.race_starts ( FULL(rnumbers) );
SELECT *
FROM cycling.race_starts
WHERE rnumbers = [39, 7, 14];
 cyclist_name   | rnumbers
----------------+-------------
 John DEGENKOLB | [39, 7, 14]

(1 rows)