CREATE INDEX
為表格的單一欄位定義新的次要索引 (2i) 或儲存附加索引 (SAI)。
Apache Cassandra 支援在大部分欄位上建立次要索引或儲存附加索引,包括 PRIMARY KEY
的分割和叢集欄位、集合和靜態欄位。對於映射,您可以使用鍵、值或項目 (鍵值對) 進行索引。
除了下列項目外,所有欄位資料類型都支援 SAI 索引
-
計數器
-
非凍結使用者定義類型 (UDT)
另請參閱: 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 陳述式。分號 ( |
|
使用兩個連字號 ( |
|
僅搜尋 CQL:單引號 ( |
|
僅搜尋 CQL:識別實體和文字值以覆寫架構和 solrConfig 檔案中的 XML 元素。 |
必要參數
參數 |
說明 |
table_name |
要建立索引的表格名稱。 |
column_name |
要建立索引的欄位名稱。SAI 僅允許名稱中包含英數字元和底線。如果您嘗試針對包含其他字元的欄位名稱定義索引,SAI 會傳回 |
選用參數
參數 |
說明 |
index_name |
索引名稱。使用引號包圍以使用特殊字元或保留大寫。如果未指定名稱,Apache Cassandra 會將索引命名為 |
keyspace_name |
包含要建立索引的表格的鍵空間名稱。如果未指定名稱,則使用目前的鍵空間。 |
map_name |
與 集合 搭配使用, |
option_map |
以 JSON 簡易格式定義選項。 |
|
|
比對字串值時忽略大小寫。預設值: |
|
|
設為 當實作將字串保留在正規化形式時,等效字串會具有唯一的二進制表示。請參閱 Unicode 標準附錄 #15,Unicode 正規化形式。 預設值: |
|
|
設為 |
|
|
向量搜尋仰賴計算向量之間的相似度或距離,以找出相關的比對。相似度函數用於計算兩個向量之間的相似度。有效選項為: |
使用注意事項
如果欄位已包含資料,則會在執行此陳述式期間為其建立索引。建立索引後,當欄位中的資料變更時,索引會自動更新。
限制:不支援為計數器欄位建立索引。
SAI 索引
您可以在表格複合分區鍵中的一個欄位上定義 SAI 索引,也就是包含多個欄位的分區鍵。如果您需要根據其中一個欄位查詢,SAI 索引是一個有用的選項。事實上,您可以在複合分區鍵中的每個欄位上定義 SAI 索引,視需要而定。
在資料庫表格中的任何欄位上定義一個或多個 SAI 索引,讓查詢可以使用索引欄位來篩選結果。
SAI 查詢運算子
SAI 支援下列針對有 SAI 索引的表格的查詢運算子
-
數字:
=
、<
、>
、⇐
、>=
、AND
、OR
、IN
-
字串:
=
、CONTAINS
、CONTAINS KEY
、AND
、OR
、IN
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 年有參賽記錄的自行車隊。
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
子句。此查詢會找出年齡相同的自行車選手。
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)
使用相同的索引找出來自相同國家的自行車選手
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
子句。
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
子句。
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)