全部產品
Search
文件中心

Tablestore:通過SDK使用多元索引

更新時間:Jun 30, 2024

如果實際業務中要用到非主鍵列查詢、多條件組合查詢等多種查詢功能,您可以通過控制台為資料表建立多元索引,然後使用多元索引查詢與分析資料。

前提條件

  • 已建立資料表,且資料表的最大版本數(max Versions)必須為1,資料生命週期(Time to Live)必須滿足如下條件中的任意一個。具體操作,請參見資料表操作

    • 資料表的資料生命週期為-1(資料永不到期)。

    • 資料表的資料生命週期不為-1時,資料表為禁止更新狀態(即是否允許更新)。

  • 已初始化Client。具體操作,請參見初始化OTSClient

注意事項

  • 建立多元索引時,多元索引中欄位的資料類型必須與資料表中欄位的資料類型相匹配。更多資訊,請參見資料類型映射

  • 如果要修改為指定資料生命週期(即取值不為-1),則您必須禁用資料表的UpdateRow更新寫入功能。同時多元索引的TTL值必須小於或等於資料表的TTL值。更多資訊,請參見生命週期管理

使用SDK

您可以使用如下語言的SDK實現時序模型功能。本文以Java SDK為例介紹多元索引的使用。

步驟一:建立多元索引

建立多元索引用於加速資料查詢。建立多元索引時,您需要將要查詢的欄位添加到多元索引中,您還可以配置多元索引的資料生命週期、預排序等進階選項。

建立多元索引時使用預設配置

以下樣本用於建立一個多元索引。該多元索引包含Col_Keyword(Keyword類型)、Col_Long(Long類型)和Col_Vector(Vector類型)三列,按照資料表主鍵進行預排序且資料永不到期。

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_Long", FieldType.LONG)));
            // 設定向量類型。
            new FieldSchema("Col_Vector", FieldType.VECTOR).setIndex(true)
                    // 向量維度為4,相似性演算法為點積。
                    .setVectorOptions(new VectorOptions(VectorDataType.FLOAT_32, 4, VectorMetricType.DOT_PRODUCT))
    ));
    request.setIndexSchema(indexSchema);
    //調用client建立多元索引。
    client.createSearchIndex(request); 
}

建立多元索引時指定預排序

以下樣本用於建立一個多元索引,多元索引包含Col_Keyword、Col_Long、Col_Text和Timestamp四列,類型分別設定為字串(String)、整型(Long)、分詞字串(TEXT)和整型(Long)。同時配置按照Timestamp列進行預排序。

private static void createSearchIndexWithIndexSort(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_Long", FieldType.LONG),
            new FieldSchema("Col_Text", FieldType.TEXT),
            new FieldSchema("Timestamp", FieldType.LONG)
                    .setEnableSortAndAgg(true)));
    //設定按照Timestamp列進行預排序。
    indexSchema.setIndexSort(new Sort(
            Arrays.<Sort.Sorter>asList(new FieldSort("Timestamp", SortOrder.ASC))));
    request.setIndexSchema(indexSchema);
    //調用client建立多元索引。
    client.createSearchIndex(request);
}

建立多元索引時配置生命週期

重要

多元索引資料生命週期功能與資料表的UpdateRow操作互斥。使用多元索引資料生命週期前,請確保已設定資料表的是否允許更新

以下樣本用於建立一個多元索引,多元索引包含Col_Keyword和Col_Long兩列,類型分別設定為字串(String)和整型(Long)。同時指定多元索引生命週期為7天。

// 請使用5.12.0及以上版本的Java SDK。
public static void createIndexWithTTL(SyncClient client) {
    int days = 7;
    CreateSearchIndexRequest createRequest = new CreateSearchIndexRequest();
    //設定資料表名稱。
    createRequest.setTableName("<TABLE_NAME>");
    //設定多元索引名稱。
    createRequest.setIndexName("<SEARCH_INDEX_NAME>");
    IndexSchema indexSchema = new IndexSchema();
    indexSchema.setFieldSchemas(Arrays.asList(
            //設定欄位名和類型。
            new FieldSchema("Col_Keyword", FieldType.KEYWORD), 
            new FieldSchema("Col_Long", FieldType.LONG)));
    createRequest.setIndexSchema(indexSchema);
    //設定多元索引TTL。
    createRequest.setTimeToLiveInDays(days);
    //調用client建立多元索引。
    client.createSearchIndex(createRequest);
}

步驟二:使用多元索引查詢資料

使用多元索引查詢資料時,請根據實際查詢情境選擇合適的查詢類型。查詢資料時支援配置要返回的列以及返回資料的排序方式。

多元索引支援通過SDK使用的查詢類型包括全匹配查詢、精確查詢、範圍查詢、首碼查詢、匹配查詢、萬用字元查詢、短語匹配查詢、列存在性查詢、多詞精確查詢、多條件組合查詢、地理位置查詢(只能對地理位置欄位使用)和巢狀型別查詢(只能對巢狀型別欄位使用)。其中地理位置查詢包括地理距離查詢、地理長方形範圍查詢和地理多邊形範圍查詢三種方式。

查詢類型

Query

描述

全匹配查詢

MatchAllQuery

常用於查詢表中資料總行數,或者隨機返回幾條資料。

精確查詢

TermQuery

採用完整精確匹配的方式查詢表中的資料,類似於字串匹配。

對於分詞字串(Text)類型,當分詞後的多個詞只要有詞可以精確匹配時,則表示行資料滿足查詢條件。

範圍查詢

RangeQuery

根據範圍條件查詢表中的資料。

對於分詞字串(Text)類型,當分詞後的多個詞只要有詞滿足範圍條件時,則表示行資料滿足查詢條件。

首碼查詢

PrefixQuery

根據首碼條件查詢表中的資料。

對於分詞字串(Text)類型,當分詞後的多個詞只要有詞滿足首碼條件時,則表示行資料滿足查詢條件。

匹配查詢

MatchQuery

採用近似匹配的方式查詢表中的資料。會先對query內容按照配置好的分詞器做切分,然後按照切分好後的詞去查詢。

不同分詞之間的關係是Or,當分詞後的多個詞只要有部分匹配時,則表示行資料滿足查詢條件。

萬用字元查詢

WildcardQuery

要匹配的值可以是一個帶有萬用字元的字串。

要匹配的值中可以用星號(“*”)代表任一字元序列,或者用問號(“?”)代表任意單個字元。

短語匹配查詢

MatchPhraseQuery

類似於MatchQuery,但是只有當分詞後的多個詞必須在行資料中以同樣的順序和位置存在時,才表示行資料滿足查詢條件。

列存在性查詢

ExistQuery

也叫NULL查詢或者空值查詢。一般用於稀疏資料中,用於判斷某一行的某一列是否存在。例如查詢所有資料中,address列不為空白的行有哪些。

只有當某一列在行資料中不存在或者為空白數組("[]")時,則表示在行資料中該列不存在。

多詞精確查詢

TermsQuery

類似於TermQuery,但是可以一次指定多個詞,當多個詞中只要有一個詞匹配,則表示行資料滿足查詢條件。

多條件組合查詢

BoolQuery

查詢條件可以包含一個或者多個子查詢條件,根據子查詢條件是否滿足來判斷一行資料是否滿足查詢條件。

子查詢條件的組合關係支援And、Or、Not等。

地理距離查詢

GeoDistanceQuery

根據一個中心點和距離條件查詢表中的資料,當一個地理位置點到指定的中心點的距離不超過指定的值時,則表示行資料滿足查詢條件。

地理長方形範圍查詢

GeoBoundingBoxQuery

根據一個長方形範圍的地理位置邊界條件查詢表中的資料,當一個地理位置點落在給出的長方形範圍內時,則表示行資料滿足查詢條件。

地理多邊形範圍查詢

GeoPolygonQuery

根據一個多邊形範圍條件查詢表中的資料,當一個地理位置點落在指定的多邊形範圍內時,則表示行資料滿足查詢條件。

巢狀查詢

NestedQuery

查詢巢狀型別中子文檔的資料。

步驟三:使用多元索引分析資料

如果要進行資料分析,例如求最值、求和、統計行數、按欄位值分組等,您可以使用Search介面的統計彙總功能來實現。具體操作,請參見統計彙總

步驟四:使用多元索引匯出資料

如果要快速匯出資料,而不關心整個結果集的順序時,您可以使用ParallelScan介面和ComputeSplits介面實現多並發匯出資料。具體操作,請參見並發匯出資料

附錄:管理多元索引

建立多元索引後,請根據需要執行相應操作。

查詢多元索引描述資訊

以下樣本用於擷取多元索引的詳細資料,例如資料生命週期、建立時間、同步狀態、欄位資訊等。

private static DescribeSearchIndexResponse describeSearchIndex(SyncClient client) {
    DescribeSearchIndexRequest request = new DescribeSearchIndexRequest();
    //設定資料表名稱。
    request.setTableName("<TABLE_NAME>"); 
    //設定多元索引名稱。
    request.setIndexName("<INDEX_NAME>"); 
    DescribeSearchIndexResponse response = client.describeSearchIndex(request);
    //列印response的詳細資料。
    System.out.println(response.jsonize()); 
    //列印多元索引資料同步狀態。
    System.out.println(response.getSyncStat().getSyncPhase().name());
    return response;
}

列出多元索引列表

以下樣本用於列出指定表的多元索引列表。

private static List<SearchIndexInfo> listSearchIndex(SyncClient client) {
    ListSearchIndexRequest request = new ListSearchIndexRequest();
    //設定資料表名稱。
    request.setTableName("<TABLE_NAME>"); 
    //擷取資料表關聯的所有多元索引。
    return client.listSearchIndex(request).getIndexInfos();
}

修改多元索引生命週期

刪除多元索引

private static void deleteSearchIndex(SyncClient client) {
    DeleteSearchIndexRequest request = new DeleteSearchIndexRequest();
    request.setTableName("<TABLE_NAME>"); //設定資料表名稱。
    request.setIndexName("<SEARCH_INDEX_NAME>"); //設定多元索引名稱。
    client.deleteSearchIndex(request); //調用client刪除多元索引。
}

常見問題

相關文檔

  • 您還可以通過控制台和命令列工具使用多元索引。具體操作,請參見通過控制台使用多元索引通過命令列工具使用多元索引

  • 當通過Search介面查詢資料時,如果要對結果集進行排序或者翻頁,您可以使用排序和翻頁功能來實現。具體操作,請參見排序和翻頁

  • 當通過Search介面查詢資料時,如果要按照某一列對結果集做摺疊,使對應類型的資料在結果展示中只出現一次,您可以使用摺疊(去重)功能來實現。具體操作,請參見摺疊(去重)

  • 如果要進行全文檢索索引,您可以對可分詞類型的欄位進行分詞後再選擇合適的查詢方式來實現。具體操作,請參見分詞

  • 如果要進行多層邏輯關係的資料存放區和查詢,您可以使用巢狀型別儲存資料後再選擇巢狀查詢來實現。具體操作,請參見巢狀型別巢狀型別查詢

  • 如果要系統自動清理多元索引中超過儲存時間的資料,您可以使用多元索引生命週期功能。具體操作,請參見生命週期管理

  • 如果要在多元索引中新增、更新或者刪除索引列,您可以使用動態修改schema功能實現。具體操作,請參見動態修改schema

  • 如果要在不修改資料表的儲存結構和資料的情況下,對新欄位新資料類型的查詢,您可以使用虛擬列功能實現。具體操作,請參見虛擬列