功能概述
虛擬列功能支援使用者在建立多元索引的時候將表中一列映射到多元索引中的虛擬列。新的虛擬列類型可以不同於表中的原始列類型,以便支援使用者在不修改表結構和資料的情況下建立一列,新的列可以用於查詢加速或者採用不同的分詞器。
使用方式
您可以使用控制台或者 SDK 進行虛擬列操作。進行虛擬列操作之前,您需要完成如下準備工作。
使用阿里雲帳號或者具有Table Store操作許可權的 RAM 使用者進行操作。如果需要為 RAM 使用者授權Table Store操作許可權,請參見通過RAM Policy為RAM使用者授權進行配置。
使用 SDK 方式進行操作時,如果當前無可用 AccessKey,則需要為阿里雲帳號或者 RAM 使用者建立 AccessKey。具體操作,請參見建立AccessKey。
已建立資料表。具體操作,請參見資料表操作。
使用 SDK 方式進行操作時,還需要完成初始化 Client。具體操作,請參見初始化OTSClient。
通過控制台操作虛擬列
通過控制台在建立多元索引時指定欄位為虛擬列後,您可以使用虛擬列查詢資料。
進入索引管理頁簽。
登入Table Store控制台。
在頁面上方,選擇地區和資源群組。
在概覽頁面,單擊執行個體名稱或在操作列單擊執行個體管理。
在執行個體詳情頁簽的資料表列表地區,單擊資料表名稱或在操作列單擊索引管理。
在索引管理頁簽,單擊建立多元索引。
在建立索引對話方塊,建立多元索引時指定虛擬列。
系統預設會自動產生索引名,可根據需要輸入索引名。
選擇Schema產生方式。
說明 欄位名和欄位類型需與資料表匹配。資料表欄位類型與多元索引欄位類型的對應關係請參見基礎資料類型及映射。
建立虛擬列。
重要 建立虛擬列時,原始欄位名必須在資料表中存在,且原始欄位的資料類型必須和虛擬列的欄位類型相匹配。
單擊添加索引欄位。
輸入欄位名和欄位類型。
開啟欄位對應虛擬列的開關,並輸入原始欄位名。
如果要配置多元索引的路由鍵、資料生命週期或者預排序方式,請開啟進階選項開關,並根據實際修改相應參數。更多資訊,請參見建立多元索引。
單擊確定。
多元索引建立完成後,在多元索引的操作列,單擊索引詳情,您可以查看多元索引的索引基本資料、索引計量、路由鍵、索引欄位和預排序等資訊。
使用虛擬列查詢資料。
在多元索引的操作列單擊搜尋。
在查詢資料對話方塊,查詢資料。
系統預設返回所有列,如果需要顯示指定屬性列,關閉擷取所有列並輸入需要返回的屬性列,多個屬性列之間用半形逗號(,)隔開。
選擇索引欄位,單擊添加,並設定索引欄位的查詢類型和值。
系統預設關閉排序功能,如需根據索引欄位對返回結果進行排序,開啟是否排序開關後,根據需要添加索引欄位並配置排序方式。
系統預設關閉統計功能,如需對指定欄位進行資料統計,開啟是否統計開關後,根據需要添加要進行統計的欄位和配置統計資訊。
單擊確定。
符合查詢條件的資料會顯示在索引管理頁簽中。
通過 SDK 操作虛擬列
通過 SDK 在建立多元索引時指定欄位為虛擬列後,您可以使用虛擬列查詢資料。
建立多元索引時指定虛擬列。
以下樣本用於建立一個多元索引,多元索引包含 Col_Keyword 和 Col_Long 兩列,同時建立虛擬列 Col_Keyword_Virtual_Long 和 Col_Long_Virtual_Keyword。Col_Keyword_Virtual_Long 映射為資料表中 Col_Keyword 列,虛擬列 Col_Long_Virtual_Keyword 映射為資料表中 Col_Long 列。
private static void createSearchIndex(SyncClient client) {
CreateSearchIndexRequest request = new CreateSearchIndexRequest();
//設定資料表名稱。
request.setTableName("<TABLE_NAME>");
//設定多元索引名稱。
request.setIndexName("<SEARCH_INDEX_NAME>");
IndexSchema indexSchema = new IndexSchema();
indexSchema.setFieldSchemas(Arrays.asList(
//設定欄位名和類型。
new FieldSchema("Col_Keyword", FieldType.KEYWORD),
//設定欄位名和類型。
new FieldSchema("Col_Keyword_Virtual_Long", FieldType.LONG)
//設定欄位是否為虛擬列。
.setVirtualField(true)
//虛擬列對應的資料表中欄位。
.setSourceFieldName("Col_Keyword"),
new FieldSchema("Col_Long", FieldType.LONG),
new FieldSchema("Col_Long_Virtual_Keyword", FieldType.KEYWORD)
.setVirtualField(true)
.setSourceFieldName("Col_Long")));
request.setIndexSchema(indexSchema);
//調用client建立多元索引。
client.createSearchIndex(request);
}
使用虛擬列查詢資料。
以下樣本用於查詢表中 Col_Long_Virtual_Keyword 列的值能夠匹配 "1000" 的資料,返回匹配到的總行數和一些匹配成功的行。
private static void query(SyncClient client) {
SearchQuery searchQuery = new SearchQuery();
TermsQuery termsQuery = new TermsQuery(); //設定查詢類型為TermsQuery。
termsQuery.setFieldName("Col_Long_Virtual_Keyword"); //設定要匹配的欄位。
termsQuery.addTerm(ColumnValue.fromString("1000")); //設定要匹配的值。
searchQuery.setQuery(termsQuery);
searchQuery.setGetTotalCount(true); //設定返回匹配的總行數。
SearchRequest searchRequest = new SearchRequest("<TABLE_NAME>", "<SEARCH_INDEX_NAME>", searchQuery);
SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet();
columnsToGet.setReturnAll(true); //設定返回所有列,不支援返回虛擬列。
searchRequest.setColumnsToGet(columnsToGet);
SearchResponse resp = client.search(searchRequest);
System.out.println("TotalCount: " + resp.getTotalCount()); //匹配到的總行數,非返回行數。
System.out.println("Row: " + resp.getRows());
}