如果實際業務中要用到非主鍵列查詢、多條件組合查詢等多種查詢功能,您可以通過控制臺為數據表創建多元索引,然后使用多元索引查詢與分析數據。
前提條件
已創建數據表,且數據表的最大版本數(max Versions)必須為1,數據生命周期(Time to Live)必須滿足如下條件中的任意一個。具體操作,請參見數據表操作。
數據表的數據生命周期為-1(數據永不過期)。
數據表的數據生命周期不為-1時,數據表為禁止更新狀態(即是否允許更新為否)。
已初始化Client。具體操作,請參見初始化OTSClient。
注意事項
使用SDK
您可以使用如下語言的SDK實現時序模型功能。本文以Java SDK為例介紹多元索引的使用。
步驟一:創建多元索引
創建多元索引用于加速數據查詢。創建多元索引時,您需要將要查詢的字段添加到多元索引中,您還可以配置多元索引的數據生命周期、預排序等高級選項。
創建多元索引時使用默認配置
以下示例用于創建一個多元索引,多元索引包含Col_Keyword和Col_Long兩列,類型分別設置為字符串(String)和整型(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_Long", FieldType.LONG)));
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 | 描述 |
全匹配查詢 | 常用于查詢表中數據總行數,或者隨機返回幾條數據。 | |
精確查詢 | 采用完整精確匹配的方式查詢表中的數據,類似于字符串匹配。 對于分詞字符串(Text)類型,當分詞后的多個詞只要有詞可以精確匹配時,則表示行數據滿足查詢條件。 | |
范圍查詢 | 根據范圍條件查詢表中的數據。 對于分詞字符串(Text)類型,當分詞后的多個詞只要有詞滿足范圍條件時,則表示行數據滿足查詢條件。 | |
前綴查詢 | 根據前綴條件查詢表中的數據。 對于分詞字符串(Text)類型,當分詞后的多個詞只要有詞滿足前綴條件時,則表示行數據滿足查詢條件。 | |
匹配查詢 | 采用近似匹配的方式查詢表中的數據。會先對query內容按照配置好的分詞器做切分,然后按照切分好后的詞去查詢。 不同分詞之間的關系是Or,當分詞后的多個詞只要有部分匹配時,則表示行數據滿足查詢條件。 | |
通配符查詢 | 要匹配的值可以是一個帶有通配符的字符串。 要匹配的值中可以用星號(“*”)代表任意字符序列,或者用問號(“?”)代表任意單個字符。 | |
短語匹配查詢 | 類似于MatchQuery,但是只有當分詞后的多個詞必須在行數據中以同樣的順序和位置存在時,才表示行數據滿足查詢條件。 | |
列存在性查詢 | 也叫NULL查詢或者空值查詢。一般用于稀疏數據中,用于判斷某一行的某一列是否存在。例如查詢所有數據中,address列不為空的行有哪些。 只有當某一列在行數據中不存在或者為空數組("[]")時,則表示在行數據中該列不存在。 | |
多詞精確查詢 | 類似于TermQuery,但是可以一次指定多個詞,當多個詞中只要有一個詞匹配,則表示行數據滿足查詢條件。 | |
多條件組合查詢 | 查詢條件可以包含一個或者多個子查詢條件,根據子查詢條件是否滿足來判斷一行數據是否滿足查詢條件。 子查詢條件的組合關系支持And、Or、Not等。 | |
地理距離查詢 | 根據一個中心點和距離條件查詢表中的數據,當一個地理位置點到指定的中心點的距離不超過指定的值時,則表示行數據滿足查詢條件。 | |
地理長方形范圍查詢 | 根據一個長方形范圍的地理位置邊界條件查詢表中的數據,當一個地理位置點落在給出的長方形范圍內時,則表示行數據滿足查詢條件。 | |
地理多邊形范圍查詢 | 根據一個多邊形范圍條件查詢表中的數據,當一個地理位置點落在指定的多邊形范圍內時,則表示行數據滿足查詢條件。 | |
嵌套查詢 | 查詢嵌套類型中子文檔的數據。 |
步驟三:使用多元索引分析數據
如果要進行數據分析,例如求最值、求和、統計行數、按字段值分組等,您可以使用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();
}
修改多元索引生命周期
// 請使用5.12.0及以上版本的Java SDK。
public void updateIndexWithTTL(SyncClient client) {
int days = 7;
UpdateSearchIndexRequest updateSearchIndexRequest = new UpdateSearchIndexRequest(tableName, indexName);
// 更新多元索引TTL。
updateSearchIndexRequest.setTimeToLiveInDays(days);
client.updateSearchIndex(updateSearchIndexRequest);
}
刪除多元索引
以下示例用于刪除指定表下的某個多元索引。
private static void deleteSearchIndex(SyncClient client) {
DeleteSearchIndexRequest request = new DeleteSearchIndexRequest();
//設置數據表名稱。
request.setTableName("<TABLE_NAME>");
//設置多元索引名稱。
request.setIndexName("<INDEX_NAME>");
//調用client刪除多元索引。
client.deleteSearchIndex(request);
}
常見問題
相關文檔
您還可以通過控制臺和命令行工具使用多元索引。具體操作,請參見通過控制臺使用多元索引和通過命令行工具使用多元索引。
當通過Search接口查詢數據時,如果要對結果集進行排序或者翻頁,您可以使用排序和翻頁功能來實現。具體操作,請參見排序和翻頁。
當通過Search接口查詢數據時,如果要按照某一列對結果集做折疊,使對應類型的數據在結果展示中只出現一次,您可以使用折疊(去重)功能來實現。具體操作,請參見折疊(去重)。
如果要進行全文檢索,您可以對可分詞類型的字段進行分詞后再選擇合適的查詢方式來實現。具體操作,請參見分詞。
如果要進行多層邏輯關系的數據存儲和查詢,您可以使用嵌套類型存儲數據后再選擇嵌套查詢來實現。具體操作,請參見嵌套類型和嵌套類型查詢。
如果要系統自動清理多元索引中超過保存時間的數據,您可以使用多元索引生命周期功能。具體操作,請參見生命周期管理。
如果要在多元索引中新增、更新或者刪除索引列,您可以使用動態修改schema功能實現。具體操作,請參見動態修改schema。
如果要在不修改數據表的存儲結構和數據的情況下,對新字段新數據類型的查詢,您可以使用虛擬列功能實現。具體操作,請參見虛擬列。