全部產品
Search
文件中心

Tablestore:虛擬列

更新時間:Oct 19, 2024

使用虛擬列功能時,您可以通過修改多元索引 schema 或者建立多元索引來實現新欄位新資料類型的查詢功能,而無需修改Table Store的儲存結構及資料。

功能概述

虛擬列功能支援使用者在建立多元索引的時候將表中一列映射到多元索引中的虛擬列。新的虛擬列類型可以不同於表中的原始列類型,以便支援使用者在不修改表結構和資料的情況下建立一列,新的列可以用於查詢加速或者採用不同的分詞器。

  • 一個 Text 欄位支援不同的分詞器

    單個字串列可以映射到多元索引多個 Text 列,不同 Text 列採用不同的分詞,以便滿足不同的業務需求。

  • 查詢加速

    不對錶中資料做清洗和重建,只需要將相應列映射為其他類型,即可在部分情境下提升查詢效能。例如數字類型轉換為 Keyword 類型可以提高精確查詢(TermQuery)的效能,String 類型轉換為數字類型可以提高範圍查詢(RangeQuery)的效能。

注意事項

  • 虛擬列支援不同類型到字串類型的相互轉換,轉換規則請參見下表。

    資料表中欄位類型

    虛擬欄欄位類型

    String

    Keyword(含數組)

    String

    FuzzyKeyword(含數組)

    String

    Text(含數組)

    String

    Long(含數組)

    String

    Double(含數組)

    String

    Geo-point(含數組)

    Long

    Keyword

    Long

    FuzzyKeyword

    Long

    Text

    Double

    Keyword

    Double

    FuzzyKeyword

    Double

    Text

  • 虛擬列目前僅支援用在查詢語句中,不能用在 ColumnsToGet 返回列值,如果需要返回列值,可以指定返回該虛擬列的原始列。

使用方式

您可以使用控制台或者 SDK 進行虛擬列操作。進行虛擬列操作之前,您需要完成如下準備工作。

  • 使用阿里雲帳號或者具有Table Store操作許可權的 RAM 使用者進行操作。如果需要為 RAM 使用者授權Table Store操作許可權,請參見通過RAM Policy為RAM使用者授權進行配置。

    使用 SDK 方式進行操作時,如果當前無可用 AccessKey,則需要為阿里雲帳號或者 RAM 使用者建立 AccessKey。具體操作,請參見建立AccessKey

  • 已建立資料表。具體操作,請參見資料表操作

  • 使用 SDK 方式進行操作時,還需要完成初始化 Client。具體操作,請參見初始化OTSClient

通過控制台操作虛擬列

通過控制台在建立多元索引時指定欄位為虛擬列後,您可以使用虛擬列查詢資料。

  1. 進入索引管理頁簽。

    1. 登入Table Store控制台

    2. 在頁面上方,選擇地區和資源群組。

    3. 概覽頁面,單擊執行個體名稱或在操作列單擊執行個體管理

    4. 執行個體詳情頁簽的資料表列表地區,單擊資料表名稱或在操作列單擊索引管理

  2. 索引管理頁簽,單擊建立多元索引

  3. 建立索引對話方塊,建立多元索引時指定虛擬列。

    image.png

    1. 系統預設會自動產生索引名,可根據需要輸入索引名

    2. 選擇Schema產生方式

      • Schema產生方式設定為手動錄入時,手動輸入欄位名,選擇欄位類型以及設定是否開啟數組。

      • Schema產生方式設定為自動產生時,系統會自動將資料表的主鍵列和屬性列作為索引欄位,可根據需要選擇欄位類型以及設定是否開啟數組。

      說明

      欄位名欄位類型需與資料表匹配。資料表欄位類型與多元索引欄位類型的對應關係請參見基礎資料類型及映射

    3. 建立虛擬列。

      重要

      建立虛擬列時,原始欄位名必須在資料表中存在,且原始欄位的資料類型必須和虛擬列的欄位類型相匹配。

      1. 單擊添加索引欄位

      2. 輸入欄位名欄位類型

      3. 開啟欄位對應虛擬列的開關,並輸入原始欄位名

    4. 如果要配置多元索引的路由鍵、資料生命週期或者預排序方式,請開啟進階選項開關,並根據實際修改相應參數。更多資訊,請參見建立多元索引

    5. 單擊確定

      多元索引建立完成後,在多元索引的操作列,單擊索引詳情,您可以查看多元索引的索引基本資料、索引計量、路由鍵、索引欄位和預排序等資訊。

  4. 使用虛擬列查詢資料。

    1. 在多元索引的操作列單擊搜尋

    2. 查詢資料對話方塊,查詢資料。

      image

      1. 系統預設返回所有列,如果需要顯示指定屬性列,關閉擷取所有列並輸入需要返回的屬性列,多個屬性列之間用半形逗號(,)隔開。

      2. 選擇索引欄位,單擊添加,並設定索引欄位的查詢類型和值。

      3. 系統預設關閉排序功能,如需根據索引欄位對返回結果進行排序,開啟是否排序開關後,根據需要添加索引欄位並配置排序方式。

      4. 系統預設關閉統計功能,如需對指定欄位進行資料統計,開啟是否統計開關後,根據需要添加要進行統計的欄位和配置統計資訊。

      5. 單擊確定

        符合查詢條件的資料會顯示在索引管理頁簽中。

通過 SDK 操作虛擬列

通過 SDK 在建立多元索引時指定欄位為虛擬列後,您可以使用虛擬列查詢資料。

  1. 建立多元索引時指定虛擬列。

    說明

    關於參數的詳細說明,請參見建立多元索引

    以下樣本用於建立一個多元索引,多元索引包含 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); 
    }
  2. 使用虛擬列查詢資料。

    以下樣本用於查詢表中 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());
    }