多元索引(Search Index)基於倒排索引和列式儲存,可以解決巨量資料的多維查詢和統計分析難題。當日常業務中有非主鍵列查詢、多列組合查詢、模糊查詢、全文檢索索引和向量檢索等複雜查詢需求以及求最值、統計行數、資料分組等資料分析需求時,您可以將這些屬性作為多元索引中的欄位並使用多元索引查詢與分析資料。
背景資訊
多元索引只適用於寬表模型。
多元索引與資料庫、搜尋引擎等其他系統均能解決巨量資料中複雜的查詢問題。它們的主要區別如下:
除了Join、事務和相關性外,Table Store能覆蓋資料庫和搜尋系統中的其他功能,同時具備資料庫的資料高可靠性和搜尋系統的進階查詢能力,可以替換常見的資料庫 + 搜尋系統組合架構
方式。
如果您的使用情境中不涉及Join操作、交易處理和複雜的相關性分析,您可以選擇使用Table Store多元索引。
索引介紹
多元索引基於倒排索引和列式儲存,可以解決巨量資料的多維資料查詢和統計分析難題,包括非主鍵列查詢、首碼查詢、模糊查詢、多欄位自由組合查詢、巢狀查詢、地理位置查詢、全文檢索索引、向量檢索和統計彙總(max、min、count、sum、avg、distinct_count、group_by、percentiles和histogram)等功能。
下圖展示了多元索引採用的倒排索引和列式儲存的原理以及多維空間索引結構。
多元索引的使用方式不同於MySQL等傳統資料庫的索引使用方式,無最左匹配原則的限制,使用時非常靈活。一般情況下一張表只需要建立一個多元索引即可。例如有一個學生表,包括姓名、學號、性別、年級、班級、家庭住址等列,如果要實現姓名等於張三且年級為三年級的學生
、家庭住址在附近1公裡內且性別為男的學生
、找出三年級二班住在某小區的學生
等任意條件的組合查詢,您可以建立一個多元索引實現,在建立多元索引時,將這些列添加到同一個多元索引中即可。
索引對比
Table Store為資料表提供了資料表主鍵查詢方式,還提供了二級索引(Secondary Index)和多元索引兩種加速查詢的索引結構。下表展示了三種查詢方式的區別。
查詢方式 | 原理 | 情境 |
資料表主鍵 | 資料表類似於一個巨大的Map,它的查詢能力也類似於Map,只能通過主鍵查詢。 | 適用於可以確定完整主鍵(Key)或主鍵首碼(Key prefix)的情境。 |
二級索引 | 通過建立一張或多張索引表,使用索引表的主鍵列查詢,相當於把資料表的主鍵查詢能力擴充到了不同的列。 | 適用於能提前確定待查詢的列,待查詢列數量較少,且可以確定完整主鍵或主鍵首碼的情境。 |
多元索引 | 使用了倒排索引、BKD樹、列存等結構,具備豐富的查詢能力。 | 適用於除資料表主鍵和二級索引之外的其他所有查詢和分析情境,例如非主鍵列的條件查詢、任意列的自由組合查詢、關係查詢、全文檢索索引、地理位置查詢、模糊查詢、嵌套結構查詢、Null值查詢、統計彙總等。 |
適用情境
多元索引可廣泛應用於各類應用系統中進行資料查詢與分析。多元索引的實際應用情境包括但不限於下表的範例情境。
應用系統 | 範例情境 |
電商平台 | 在電商平台中使用多元索引實現商品的分類、屬性篩選等功能,方便使用者進行快速的商品搜尋和篩選。 |
社交應用 | 在社交網路中使用多元索引實現使用者的關注關係、好友關係等查詢以及根據使用者的興趣標籤進行推薦和匹配。 |
日誌分析 | 在日誌分析情境中使用多元索引進行日誌的關鍵字搜尋、按照時間範圍查詢等操作,用於快速定位問題和分析日誌資料。 |
物聯網資料分析 | 在物聯網情境中使用多元索引進行裝置資料的查詢和分析,例如按照裝置類型、地理位置等進行篩選和統計。 |
應用效能監控 | 在應用效能監控中使用多元索引進行指標資料的彙總和查詢,例如按照時間範圍、應用程式名稱等進行篩選和匯總。 |
地理位置服務 | 在地理位置服務中使用多元索引進行地理位置的查詢和附近搜尋,用於提供附近的店鋪、景點、服務等資訊。 |
文本搜尋引擎 | 在文本搜尋引擎中使用多元索引進行全文檢索索引和相關性排序,用於快速搜尋和尋找文檔、文章等資訊。 |
功能說明
功能列表
多元索引的功能列表請參見下表。
功能 | 說明 | 文檔 |
任意列的查詢(包括主鍵列和非主鍵列) | 使用任意列進行資料查詢,適用於大多數情境下的查詢需求。 當使用主鍵列或主鍵列首碼查詢無法滿足需求時,您可以建立一個多元索引並在索引中添加要查詢的欄位,即可通過該列的值查詢資料。 | 多元索引任意查詢,例如基礎查詢等 |
多欄位自由組合查詢 | 靈活組合多個欄位進行高效查詢,適用於訂單系統、日誌分析、使用者畫像等需要多條件式篩選的情境。 以訂單情境為例,表中可能包含多達幾十個欄位。在關係型資料庫中,為滿足多種欄位組合的查詢需求,可能需要建立上百個索引。同時如果某種組合方式未提前預想到且未建立相應索引,則無法高效查詢。 使用Table Store,只需建立一個多元索引並在索引中添加可能要查詢的欄位。查詢時可自由組合這些欄位。此外,多元索引還支援多種邏輯關係查詢,例如And、Or、Not。 | |
地理位置查詢 | 隨著行動裝置的普及,地理位置資訊的價值越來越大,朋友圈、微博、外賣、運動、車連網等應用中均增加了地理位置功能,這些應用中的資料包含地理位置資訊,因此需要相匹配的查詢能力。 多元索引提供以下地理位置查詢功能:
基於上述功能,如果應用中需要地理位置相關查詢,使用Table Store多元索引即可一站式解決,無需依賴其他資料庫或搜尋系統。 | |
全文檢索索引 | 尋找包含指定短語的資料,適用於巨量資料分析、內容搜尋、知識管理、社交媒體分析、日誌分析、智能問答系統、合規審查、個人化推薦等情境。 多元索引的分詞能力可用於實現全文檢索索引,但是多元索引只提供最基礎的BM25相關性,不提供自訂相關效能力。因此,如果有複雜相關性的搜尋需求,建議使用搜尋系統實現,否則可以使用多元索引滿足需求。 目前多元索引提供了單字分詞、分隔字元分詞、最小數量語義分詞、最大數量語義分詞和模糊分詞5種分詞類型,請根據實際情境配置。此外,如需在返回結果中對關鍵詞進行高亮顯示,可使用摘要與高亮功能實現。 | |
向量檢索 | 多元索引支援向量檢索能力,您能夠利用數值向量進行高效的近似最近鄰查詢,從而在大規模資料集中找到最相似的資料項目。該功能適用於檢索增強產生(RAG)、推薦系統、相似性檢測(映像、視頻和語音等)、自然語言處理等應用情境。 | |
模糊查詢 | 多元索引提供了萬用字元查詢、首碼查詢和尾碼查詢功能,以滿足使用者不同情境的模糊查詢需求。
| |
列存在性查詢(NULL查詢) | 查詢某一列是否為空白值,類似於NULL查詢,適用於資料完整性檢查、資料清洗等情境。 | |
巢狀查詢 | 線上應用的資料中,除了常見的扁平化結構外,還存在一些更複雜的多層嵌套結構情境,例如圖片標籤。假設某個系統中儲存了大量圖片,每張圖片包含多個實體(例如房子、轎車、人等),這些實體在圖片中的位置和空間大小各不相同,因此每個實體的權重(score)也不同。這種情況下,每張圖片均對應多個標籤,每個標籤由一個名稱和一個權重分組成。 如果要根據標籤中的條件式篩選圖片,可以使用巢狀型別查詢功能。其中圖片標籤採用JSON格式儲存,資料範例如下:
巢狀型別查詢能夠有效處理具有多層邏輯關係的資料存放區與查詢需求,為複雜資料建模提供了極大的靈活性和便利性。 對於包含巢狀型別的複雜資料結構(例如JSON)支援使用摘要與高亮功能來精準定位所需資訊。 | |
去重 | 多元索引提供了查詢結果的去重功能,能夠有效提升結果的多樣性。去重功能通過限制某個屬性在單次查詢結果中的最大出現次數,避免結果過度集中於某一特定值。例如,在電商搜尋情境中,當搜尋 | |
排序 | Table Store預設按照主鍵的字母序排序,如果需要按照其他欄位進行排序,您可以使用多元索引的排序功能。 多元索引提供了豐富的排序能力,包括正序或逆序、單條件排序以及多條件排序等,所有排序均為全域排序。多元索引的預設返回結果按照表中主鍵的字母序排列。 | |
資料總行數 | 使用多元索引查詢資料時支援指定返回本次請求命中的資料行數。此功能可用於資料校正、營運等情境。
| |
統計彙總 | 多元索引提供常見的統計彙總功能,包括最大值(Max)、最小值(Min)、平均值(Avg)、求和(Sum)、統計行數(Count)、去重統計行數(DistinctCount)、分組(GroupBy)、百分位(Percentile)、長條圖(Histogram)等功能,可以滿足使用者在輕量級分析情境對基本統計彙總的需求。 |
支援地區
目前多元索引功能開放的地區包括華東1(杭州)、華東2(上海)、華北1(青島)、華北2(北京)、華北3(張家口)、華北6(烏蘭察布)、華南1(深圳)、華南3(廣州)、西南1(成都)、中國香港、日本(東京)、新加坡、馬來西亞(吉隆坡)、印尼(雅加達)、菲律賓(馬尼拉)、泰國(曼穀)、德國(法蘭克福)、英國(倫敦)、美國(矽谷)、美國(維吉尼亞)、沙特(利雅得)。其中美國(矽谷)地區暫不支援向量檢索功能。
容災能力
多元索引在具備同城容災能力的地區預設提供同城冗餘的容災能力,會將資料同時儲存到地區內多個不同的可用性區域。在單可用性區域遇到斷電、斷網、火災等故障時仍能保障資料的正常讀寫服務、不會影響讀寫可用性。
目前多元索引支援同城冗餘的地區包括華東1(杭州)、華東2(上海)、華北2(北京)、華北3(張家口)、華北6(烏蘭察布)、華南1(深圳)、中國香港、日本(東京)、新加坡、印尼(雅加達)、德國(法蘭克福)。
資料生命週期
如果資料表無UpdateRow更新寫入操作,則您可以使用多元索引TTL。更多資訊,請參見生命週期管理。
當只需要保留一段時間內的資料且時間欄位不需要更新時,您可以通過按時間分表的方法實現資料生命週期功能。按時間分表的原理、原則和優點請參見下表說明。
維度 | 按時間分表 |
原理 | 按照固定時間,例如“日”、“周”、“月”或者“年”分表,並為每個表建立一個多元索引,根據需要保留所需時間的資料表。 例如當資料需要保留6個月時,可以將每個月的資料儲存在一張資料表中,例如table_1、table_2、table_3、table_4、table_5、table_6,並為每個資料表建立一個多元索引,每個資料表和多元索引中只會儲存一個月的資料,只需要每個月刪除6個月前的資料表即可。 當使用多元索引查詢資料時,如果時間範圍在某個表中,只需要查詢對應表;如果時間範圍在多個表中,需要對涉及的資料表均查詢一次,再將查詢結果合并。 |
原則 | 單表(單索引)大小不超過500億行,當單表(單索引)大小不超過200億行時,多元索引的查詢效能最好。 |
優點 |
|
資料多版本
多元索引不支援資料多版本,即不能對設定了資料多版本的資料表建立多元索引。
當在單版本中每次寫入資料時自訂了timestamp,且先寫入版本號碼較大的資料,後寫入版本號碼較小的資料,此時先寫入的版本號碼較大的資料可能會被後寫入的版本號碼較小的資料覆蓋。
Search和ParallelScan請求的結果資料中不一定包括timestamp屬性。
使用限制
多元索引使用非同步方式從資料表中同步資料,存在資料延遲的現象,無法即時查詢資料,延遲通常在3秒以內。更多關於多元索引的使用限制,請參見多元索引使用限制。
計費說明
使用多元索引時,索引資料量佔用的儲存空間為多元索引儲存,通過多元索引查詢與分析資料會消耗計算資源。更多資訊,請參見計費概述。
開發整合
介面說明
多元索引提供了索引管理和資料查詢的介面。其中資料查詢介面包括通用查詢(Search)介面和資料匯出(ParallelScan)介面,兩種資料查詢介面的功能大部分相同,但是ParallelScan介面為了提高某些方面的效能和吞吐能力捨棄了部分功能。
分類 | 介面 | 描述 |
索引管理 | 建立一個多元索引。 | |
更新多元索引的配置,包括資料生命週期(TTL)和多元索引schema。 | ||
擷取多元索引的詳細描述資訊。 | ||
列出多元索引的列表。 | ||
刪除某個多元索引。 | ||
資料查詢 | 全功能查詢介面,支援多元索引的所有功能點,包括所有的查詢功能以及排序、統計彙總等分析能力,其結果會按照指定的順序返回。
| |
多並發資料匯出介面,只包括所有的查詢功能,捨棄了排序、統計彙總等分析能力,能將命中的資料以更快的速度全部返回。 相對於Search介面,ParallelScan可以提供更好的效能,單並發時效能(吞吐能力)是Search介面的5倍。
多並發匯出資料時,您還需要通過ComputeSplits介面擷取當前ParallelScan單個請求的最大並發數。 |
整合方式
您可以使用以下的SDK或命令列工具操作多元索引。
常見問題
相關文檔
附錄:與SQL匹配情況
多元索引部分功能可以實現與SQL功能等價的效果。SQL中的大部分功能在多元索引中相匹配的功能請參見下表。
SQL | 多元索引 | 多元索引文檔 |
Show | DescribeSearchIndex | |
Select | 任意Query中的ColumnsToGet參數 | 多元索引任意查詢,例如基礎查詢等 |
From | 任意Query中的IndexName參數 重要 已經支援單索引,多索引尚未支援。 | 多元索引任意查詢,例如基礎查詢等 |
Where | 任意Query中的條件 | 多元索引任意查詢,例如基礎查詢等 |
Order by | 任意Query中的sort參數 | |
Limit | 任意Query中的limit參數 | |
Delete |
| |
Like | WildcardQuery | |
And | BoolQuery中operator = and | |
Or | BoolQuery中operator = or | |
Not | BoolQuery(mustNotQueries) | |
Between | RangeQuery | |
Null | ExistsQuery | |
In | TermsQuery | |
Min | Aggregation:min | |
Max | Aggregation:max | |
Avg | Aggregation:avg | |
Count | Aggregation:count | |
Count(distinct) | Aggregation:distinctCount | |
Sum | Aggregation:sum | |
Group By | GroupBy |