創(chuàng)建多元索引
通過控制臺(tái)、命令行或SDK您可以為某一個(gè)表創(chuàng)建一個(gè)或多個(gè)多元索引,然后使用多元索引對(duì)表中的數(shù)據(jù)進(jìn)行查詢和簡單分析。
最佳使用方式
請(qǐng)根據(jù)實(shí)際查詢需求確定在一張數(shù)據(jù)表中創(chuàng)建多元索引的個(gè)數(shù)。
例如一張數(shù)據(jù)表有5個(gè)字段,分別為id、name、age、city、sex,需要按照name、age或city查詢數(shù)據(jù)時(shí),有兩種創(chuàng)建多元索引的方式。
方法一:一個(gè)字段建立一個(gè)多元索引
按照name、age或city字段分別創(chuàng)建多元索引,名稱分別為name_index、age_index、city_index。
如果按照城市查詢學(xué)生,則查詢city_index,如果按照年齡查詢學(xué)生,則查詢age_index。
如果查詢年齡小于12歲且城市是成都的學(xué)生,此種方式就無法查詢。
此方式的實(shí)現(xiàn)類似于全局二級(jí)索引,使用此方式創(chuàng)建多元索引會(huì)帶來更高的費(fèi)用,因此不建議使用此方式創(chuàng)建多元索引。
方法二(推薦):多個(gè)字段創(chuàng)建在一個(gè)多元索引中
將name、age和city字段創(chuàng)建在一個(gè)多元索引中,名稱為student_index。
如果按照城市查詢學(xué)生,則查詢student_index中city字段;如果按照年齡查詢學(xué)生,則查詢student_index中age字段。
如果查詢年齡小于12歲且城市是成都的學(xué)生,則查詢student_index中age和city字段。
此方式才能發(fā)揮多元索引最大優(yōu)勢(shì),不僅功能更豐富,而且價(jià)格會(huì)更低。極力推薦使用此方式創(chuàng)建多元索引。
使用限制
創(chuàng)建索引的時(shí)效性
創(chuàng)建多元索引后,需要等幾秒鐘才能使用,但是此過程中不影響數(shù)據(jù)寫入,只影響索引元信息的查詢和索引查詢。
創(chuàng)建多元索引時(shí),請(qǐng)確保多元索引中的字段類型與表中的字段類型相匹配。更多信息,請(qǐng)參見基礎(chǔ)數(shù)據(jù)類型及映射。
數(shù)量限制
更多信息,請(qǐng)參見多元索引限制。
參數(shù)
創(chuàng)建多元索引時(shí),需要指定數(shù)據(jù)表名稱(tableName)、多元索引名稱(indexName)和索引的結(jié)構(gòu)信息(indexSchema),其中indexSchema包含fieldSchemas(Index所有字段的設(shè)置)、indexSetting(索引設(shè)置)和indexSort(索引預(yù)排序設(shè)置)。詳細(xì)參數(shù)說明請(qǐng)參見下表。
參數(shù) | 說明 |
tableName | 數(shù)據(jù)表名稱。 |
indexName | 多元索引名稱。 |
fieldSchemas | 索引字段列表,每個(gè)fieldSchema包含如下內(nèi)容:
|
indexSetting | 索引設(shè)置,包含routingFields設(shè)置。 routingFields(可選):自定義路由字段。可以選擇部分主鍵列作為路由字段,在進(jìn)行索引數(shù)據(jù)寫入時(shí),會(huì)根據(jù)路由字段的值計(jì)算索引數(shù)據(jù)的分布位置,路由字段的值相同的記錄會(huì)被索引到相同的數(shù)據(jù)分區(qū)中。 |
indexSort | 索引預(yù)排序設(shè)置,包含sorters設(shè)置。如果不設(shè)置,則默認(rèn)按照主鍵排序。 說明 含有Nested類型的索引不支持indexSort,沒有預(yù)排序。 sorters(可選):索引預(yù)排序方式的列表,支持按照主鍵排序和字段值排序。更多信息,請(qǐng)參見排序和翻頁。 |
timeToLive | 可選參數(shù)。數(shù)據(jù)生命周期(TTL),即數(shù)據(jù)的保存時(shí)間,單位為秒。 默認(rèn)值為-1,表示數(shù)據(jù)永不過期。數(shù)據(jù)生命周期的取值最低為86400秒(一天),也可設(shè)置為-1(永不過期)。 當(dāng)數(shù)據(jù)的保存時(shí)間超過設(shè)置的數(shù)據(jù)生命周期時(shí),系統(tǒng)會(huì)自動(dòng)清理超過數(shù)據(jù)生命周期的數(shù)據(jù)。 多元索引生命周期的使用方式,請(qǐng)參見生命周期管理。 |
注意事項(xiàng)
當(dāng)要實(shí)現(xiàn)全文檢索時(shí),您可以在多元索引中將字段設(shè)置為可分詞字符串(TEXT)類型并為TEXT類型的字段設(shè)置分詞,然后使用匹配查詢或短語匹配查詢功能查詢數(shù)據(jù)。關(guān)于分詞的更多信息,請(qǐng)參見分詞。
在不修改表格存儲(chǔ)的存儲(chǔ)結(jié)構(gòu)及數(shù)據(jù)的情況下,當(dāng)要實(shí)現(xiàn)新字段和新數(shù)據(jù)類型的查詢功能時(shí),您可以在多元索引中將字段設(shè)置為虛擬列。更多信息,請(qǐng)參見虛擬列。
當(dāng)要使用日期數(shù)據(jù)類型進(jìn)行數(shù)據(jù)查詢時(shí),您可以在多元索引中將數(shù)據(jù)表中的整型(Integer)或字符串(String)類型的數(shù)據(jù)映射為日期數(shù)據(jù)類型。更多信息,請(qǐng)參見日期時(shí)間類型。
當(dāng)要使用數(shù)值向量進(jìn)行近似最近鄰查詢時(shí),您可以在多元索引中將字段設(shè)置為向量類型,然后使用向量檢索介紹與使用功能查詢數(shù)據(jù)。
當(dāng)要使用數(shù)組類型存儲(chǔ)數(shù)據(jù)時(shí),您可以在數(shù)據(jù)表中以String類型字段存儲(chǔ)數(shù)據(jù),然后在多元索引中將字段設(shè)置為數(shù)組。
在寫入數(shù)據(jù)到數(shù)據(jù)表中時(shí),數(shù)組類型字段的值必須按照J(rèn)SON數(shù)組格式寫入,例如["a","b","c"]。
說明數(shù)組類型僅是多元索引中的概念,數(shù)據(jù)表中還不支持?jǐn)?shù)組。更多信息,請(qǐng)參見數(shù)組和嵌套類型。
當(dāng)要使用單字段存儲(chǔ)存在層次關(guān)系或者一對(duì)多關(guān)系的數(shù)據(jù)時(shí),您可以在多元索引中將字段設(shè)置為嵌套類型,然后使用嵌套類型查詢功能查詢數(shù)據(jù)。
在寫入數(shù)據(jù)到數(shù)據(jù)表中時(shí),嵌套類型字段的值必須按照J(rèn)SON數(shù)組格式寫入,例如
[{"tagName":"tag1", "score":0.8}, {"tagName":"tag2", "score":0.2}]
。當(dāng)要存儲(chǔ)的數(shù)據(jù)為地理位置信息時(shí),您可以在多元索引中將字段設(shè)置為地理位置(Geo-point)類型,然后使用地理距離查詢、地理長方形范圍查詢或地理多邊形范圍查詢功能查詢數(shù)據(jù)。
系統(tǒng)默認(rèn)使用分區(qū)鍵作為路由鍵,當(dāng)要使用其他主鍵列作為路由鍵來定向搜索指定數(shù)據(jù)分區(qū),以減少長尾對(duì)延遲的影響時(shí),您可以修改路由字段配置。更多信息,請(qǐng)參見多元索引路由字段的使用。
多元索引默認(rèn)按照主鍵升序的排序方式返回查詢結(jié)果,當(dāng)要按照指定字段值或主鍵降序進(jìn)行預(yù)排序時(shí),您可以修改預(yù)排序方式。更多信息,請(qǐng)參見索引預(yù)排序。
當(dāng)要實(shí)現(xiàn)自動(dòng)清理多元索引中的歷史數(shù)據(jù)時(shí),您可以使用多元索引的數(shù)據(jù)生命周期(TTL)功能有效地管理數(shù)據(jù),減少數(shù)據(jù)存儲(chǔ)空間,降低存儲(chǔ)成本。更多信息,請(qǐng)參見生命周期管理。
當(dāng)要在查詢結(jié)果中高亮突出顯示匹配到的關(guān)鍵詞時(shí),您可以使用查詢高亮功能實(shí)現(xiàn)。更多信息,請(qǐng)參見查詢高亮。
使用方式
您可以使用控制臺(tái)、命令行工具或者SDK進(jìn)行創(chuàng)建多元索引操作。
進(jìn)行多元索引創(chuàng)建之前,您需要完成如下準(zhǔn)備工作。
使用阿里云賬號(hào)或者具有表格存儲(chǔ)操作權(quán)限的RAM用戶進(jìn)行操作。如果需要為RAM用戶授權(quán)表格存儲(chǔ)操作權(quán)限,請(qǐng)參見通過RAM Policy為RAM用戶授權(quán)進(jìn)行配置。
使用SDK方式和命令行工具方式進(jìn)行操作時(shí),如果當(dāng)前無可用AccessKey,則需要為阿里云賬號(hào)或者RAM用戶創(chuàng)建AccessKey。具體操作,請(qǐng)參見創(chuàng)建AccessKey。
已創(chuàng)建數(shù)據(jù)表。具體操作,請(qǐng)參見數(shù)據(jù)表操作。
使用SDK方式進(jìn)行操作時(shí),還需要完成初始化Client。具體操作,請(qǐng)參見初始化OTSClient。
使用命令行工具進(jìn)行操作前,還需要完成下載并啟動(dòng)命令行工具,然后配置接入實(shí)例信息。具體操作,請(qǐng)參見下載命令行工具和啟動(dòng)并配置接入信息。
通過控制臺(tái)創(chuàng)建一個(gè)多元索引。
進(jìn)入索引管理頁簽。
在頁面上方,選擇資源組和地域。
在概覽頁面,單擊實(shí)例名稱或在操作列單擊實(shí)例管理。
在實(shí)例詳情頁簽的數(shù)據(jù)表列表區(qū)域,單擊數(shù)據(jù)表名稱或在操作列單擊索引管理。
在索引管理頁簽,單擊創(chuàng)建多元索引。
在創(chuàng)建索引對(duì)話框,創(chuàng)建多元索引。
系統(tǒng)默認(rèn)會(huì)自動(dòng)生成索引名,可根據(jù)需要設(shè)置索引名。
選擇Schema生成方式。
重要字段名和字段類型需與數(shù)據(jù)表匹配。數(shù)據(jù)表字段類型與多元索引字段類型的對(duì)應(yīng)關(guān)系請(qǐng)參見基礎(chǔ)數(shù)據(jù)類型及映射。
當(dāng)設(shè)置Schema生成方式為手動(dòng)錄入時(shí),手動(dòng)輸入字段名,選擇字段類型以及設(shè)置是否開啟數(shù)組。
當(dāng)設(shè)置Schema生成方式為自動(dòng)生成時(shí),系統(tǒng)會(huì)自動(dòng)將數(shù)據(jù)表的主鍵列和屬性列作為索引字段,可根據(jù)需要選擇字段類型以及設(shè)置是否開啟數(shù)組。
說明在部分情況下如果要優(yōu)化性能,則可以使用虛擬列。關(guān)于虛擬列的更多信息,請(qǐng)參見虛擬列。
如果需要配置數(shù)據(jù)生命周期、路由鍵、索引預(yù)排序等選項(xiàng),請(qǐng)打開高級(jí)選項(xiàng)開關(guān),并根據(jù)下表說明配置參數(shù)。
參數(shù)
說明
路由鍵
自定義路由字段。可以選擇部分主鍵列作為路由字段,在進(jìn)行索引數(shù)據(jù)寫入時(shí),表格存儲(chǔ)會(huì)根據(jù)路由字段的值計(jì)算索引數(shù)據(jù)的分布位置,路由字段的值相同的記錄會(huì)被索引到相同的數(shù)據(jù)分區(qū)中。
數(shù)據(jù)生命周期
多元索引中數(shù)據(jù)的保存時(shí)間,單位為秒。默認(rèn)值為-1,表示數(shù)據(jù)永不過期。
數(shù)據(jù)生命周期的取值最低為86400秒(一天),也可設(shè)置為-1(永不過期)。同時(shí)多元索引的TTL值必須小于或等于數(shù)據(jù)表的TTL值。
如果需要系統(tǒng)自動(dòng)清理多元索引中的歷史數(shù)據(jù),您可以配置數(shù)據(jù)生命周期為指定時(shí)間。當(dāng)數(shù)據(jù)的保存時(shí)間超過設(shè)置的數(shù)據(jù)生命周期時(shí),系統(tǒng)會(huì)自動(dòng)清理超過數(shù)據(jù)生命周期的數(shù)據(jù)。
預(yù)排序
多元索引默認(rèn)按照設(shè)置的索引預(yù)排序方式進(jìn)行排序,用于確定數(shù)據(jù)的默認(rèn)返回順序。
索引預(yù)排序只支持按照主鍵排序和按照字段值排序兩種方式。如果未自定義預(yù)排序,則默認(rèn)為主鍵排序,您可以根據(jù)實(shí)際查詢場景指定預(yù)排序方式。
重要含有Nested類型字段的多元索引不支持索引預(yù)排序。
單擊確定。
多元索引創(chuàng)建完成后,在索引列表的操作列,單擊索引詳情,可查看索引表的索引基本信息、索引計(jì)量、路由鍵、索引字段和預(yù)排序等信息。
通過命令行工具執(zhí)行create_search_index
命令創(chuàng)建多元索引。更多信息,請(qǐng)參見多元索引。
執(zhí)行
create_search_index
命令創(chuàng)建一個(gè)多元索引search_index。create_search_index -n search_index
根據(jù)系統(tǒng)提示輸入索引Schema,示例如下:
索引Schema包括IndexSetting(索引設(shè)置)、FieldSchemas(Index的所有字段的設(shè)置)和IndexSort(索引預(yù)排序設(shè)置)。關(guān)于索引Schema的更多信息,請(qǐng)參見創(chuàng)建多元索引。
{ "IndexSetting": { "RoutingFields": null }, "FieldSchemas": [ { "FieldName": "gid", "FieldType": "LONG", "Index": true, "EnableSortAndAgg": true, "Store": true, "IsArray": false, "IsVirtualField": false }, { "FieldName": "uid", "FieldType": "LONG", "Index": true, "EnableSortAndAgg": true, "Store": true, "IsArray": false, "IsVirtualField": false }, { "FieldName": "col2", "FieldType": "LONG", "Index": true, "EnableSortAndAgg": true, "Store": true, "IsArray": false, "IsVirtualField": false }, { "FieldName": "col3", "FieldType": "TEXT", "Index": true, "Analyzer": "single_word", "AnalyzerParameter": { "CaseSensitive": true, "DelimitWord": null }, "EnableSortAndAgg": false, "Store": true, "IsArray": false, "IsVirtualField": false }, { "FieldName": "col1", "FieldType": "KEYWORD", "Index": true, "EnableSortAndAgg": true, "Store": true, "IsArray": false, "IsVirtualField": false }, { "FieldName": "col3V", "FieldType": "LONG", "Index": true, "EnableSortAndAgg": true, "Store": true, "IsArray": false, "IsVirtualField": true, "SourceFieldNames": [ "col3" ] } ] }
您可以通過Java SDK、Go SDK、Python SDK、Node.js SDK、.NET SDK和PHP SDK創(chuàng)建多元索引。此處以Java SDK為例介紹創(chuàng)建多元索引的操作。
創(chuàng)建多元索引時(shí)使用默認(rèn)配置
以下示例用于創(chuàng)建一個(gè)多元索引。該多元索引包含Col_Keyword(KEYWORD類型)、Col_Long(LONG類型)和Col_Vector(VECTOR類型)三列,按照數(shù)據(jù)表主鍵進(jìn)行預(yù)排序且數(shù)據(jù)永不過期。
private static void createSearchIndex(SyncClient client) {
CreateSearchIndexRequest request = new CreateSearchIndexRequest();
//設(shè)置數(shù)據(jù)表名稱。
request.setTableName("<TABLE_NAME>");
//設(shè)置多元索引名稱。
request.setIndexName("<SEARCH_INDEX_NAME>");
IndexSchema indexSchema = new IndexSchema();
indexSchema.setFieldSchemas(Arrays.asList(
//設(shè)置字段名和類型。
new FieldSchema("Col_Keyword", FieldType.KEYWORD),
new FieldSchema("Col_Long", FieldType.LONG),
// 設(shè)置向量類型。
new FieldSchema("Col_Vector", FieldType.VECTOR).setIndex(true)
// 向量維度為4,相似度算法為點(diǎn)積。
.setVectorOptions(new VectorOptions(VectorDataType.FLOAT_32, 4, VectorMetricType.DOT_PRODUCT))
));
request.setIndexSchema(indexSchema);
//調(diào)用client創(chuàng)建多元索引。
client.createSearchIndex(request);
}
創(chuàng)建多元索引時(shí)指定IndexSort
以下示例用于創(chuàng)建一個(gè)多元索引,多元索引包含Col_Keyword(KEYWORD類型)、Col_Long(LONG類型)、Col_Text(TEXT類型)和Timestamp(LONG類型)四列,同時(shí)配置按照Timestamp列進(jìn)行預(yù)排序。
private static void createSearchIndexWithIndexSort(SyncClient client) {
CreateSearchIndexRequest request = new CreateSearchIndexRequest();
//設(shè)置數(shù)據(jù)表名稱。
request.setTableName("<TABLE_NAME>");
//設(shè)置多元索引名稱。
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)));
//設(shè)置按照Timestamp列進(jìn)行預(yù)排序。
indexSchema.setIndexSort(new Sort(
Arrays.<Sort.Sorter>asList(new FieldSort("Timestamp", SortOrder.ASC))));
request.setIndexSchema(indexSchema);
//調(diào)用client創(chuàng)建多元索引。
client.createSearchIndex(request);
}
創(chuàng)建多元索引時(shí)設(shè)置生命周期
請(qǐng)確保數(shù)據(jù)表的更新狀態(tài)為禁止。
以下示例用于創(chuàng)建一個(gè)多元索引,多元索引包含Col_Keyword(KEYWORD類型)和Col_Long(LONG類型)兩列,同時(shí)指定多元索引生命周期為7天。
// 請(qǐng)使用5.12.0及以上版本的Java SDK。
public static void createIndexWithTTL(SyncClient client) {
int days = 7;
CreateSearchIndexRequest request = new CreateSearchIndexRequest();
//設(shè)置數(shù)據(jù)表名稱。
request.setTableName("<TABLE_NAME>");
//設(shè)置多元索引名稱。
request.setIndexName("<SEARCH_INDEX_NAME>");
IndexSchema indexSchema = new IndexSchema();
indexSchema.setFieldSchemas(Arrays.asList(
//設(shè)置字段名和類型。
new FieldSchema("Col_Keyword", FieldType.KEYWORD),
new FieldSchema("Col_Long", FieldType.LONG)));
request.setIndexSchema(indexSchema);
//設(shè)置多元索引TTL。
request.setTimeToLiveInDays(days);
//調(diào)用client創(chuàng)建多元索引。
client.createSearchIndex(request);
}
創(chuàng)建多元索引時(shí)指定虛擬列
以下示例用于創(chuàng)建一個(gè)多元索引,多元索引包含Col_Keyword(KEYWORD類型)和Col_Long(LONG類型)兩列,同時(shí)創(chuàng)建虛擬列Col_Keyword_Virtual_Long(LONG類型)和Col_Long_Virtual_Keyword(KEYWORD類型)。Col_Keyword_Virtual_Long映射為數(shù)據(jù)表中Col_Keyword列,虛擬列Col_Long_Virtual_Keyword映射為數(shù)據(jù)表中Col_Long列。
private static void createSearchIndex(SyncClient client) {
CreateSearchIndexRequest request = new CreateSearchIndexRequest();
//設(shè)置數(shù)據(jù)表名稱。
request.setTableName("<TABLE_NAME>");
//設(shè)置多元索引名稱。
request.setIndexName("<SEARCH_INDEX_NAME>");
IndexSchema indexSchema = new IndexSchema();
indexSchema.setFieldSchemas(Arrays.asList(
//設(shè)置字段名和類型。
new FieldSchema("Col_Keyword", FieldType.KEYWORD),
//設(shè)置字段名和類型。
new FieldSchema("Col_Keyword_Virtual_Long", FieldType.LONG)
//設(shè)置字段是否為虛擬列。
.setVirtualField(true)
//虛擬列對(duì)應(yīng)的數(shù)據(jù)表中字段。
.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);
//調(diào)用client創(chuàng)建多元索引。
client.createSearchIndex(request);
}
創(chuàng)建多元索引時(shí)開啟查詢高亮
以下示例用于創(chuàng)建一個(gè)多元索引,多元索引包含Col_Keyword(KEYWORD類型)、Col_Long(LONG類型)和Col_Text(TEXT類型)三列,同時(shí)為Col_Text列開啟查詢高亮功能。
private static void createSearchIndexwithHighlighting(SyncClient client) {
CreateSearchIndexRequest request = new CreateSearchIndexRequest();
//設(shè)置數(shù)據(jù)表名稱。
request.setTableName("<TABLE_NAME>");
//設(shè)置多元索引名稱。
request.setIndexName("<SEARCH_INDEX_NAME>");
IndexSchema indexSchema = new IndexSchema();
indexSchema.setFieldSchemas(Arrays.asList(
//設(shè)置字段名和類型。
new FieldSchema("Col_Keyword", FieldType.KEYWORD),
new FieldSchema("Col_Long", FieldType.LONG),
//為字段開啟查詢高亮功能。
new FieldSchema("Col_Text", FieldType.TEXT).setIndex(true).setEnableHighlighting(true)
));
request.setIndexSchema(indexSchema);
//調(diào)用client創(chuàng)建多元索引。
client.createSearchIndex(request);
}
后續(xù)操作
創(chuàng)建多元索引后,您可以通過多元索引進(jìn)行數(shù)據(jù)查詢、數(shù)據(jù)分析與數(shù)據(jù)導(dǎo)出。
操作 | 可選功能 |
數(shù)據(jù)查詢 | 請(qǐng)根據(jù)實(shí)際業(yè)務(wù)場景選擇合適的查詢方式。
當(dāng)通過Search接口查詢數(shù)據(jù)時(shí),如果要對(duì)結(jié)果集進(jìn)行排序或者翻頁,您可以使用排序和翻頁功能來實(shí)現(xiàn)。具體操作,請(qǐng)參見排序和翻頁。 |
數(shù)據(jù)分析 | |
數(shù)據(jù)導(dǎo)出 |
相關(guān)文檔
創(chuàng)建多元索引后,請(qǐng)根據(jù)需要執(zhí)行相應(yīng)操作。
如果希望清理多元索引中的歷史數(shù)據(jù)或者希望延長數(shù)據(jù)保存時(shí)間,您可以修改多元索引的數(shù)據(jù)生命周期。具體操作,請(qǐng)參見生命周期管理。
如果要在多元索引中新增、更新或者刪除索引列,您可以使用動(dòng)態(tài)修改schema功能實(shí)現(xiàn)。具體操作,請(qǐng)參見動(dòng)態(tài)修改schema。
如果要獲取某個(gè)數(shù)據(jù)表關(guān)聯(lián)的所有多元索引的列表信息,您可以使用列出多元索引列表功能實(shí)現(xiàn)。具體操作,請(qǐng)參見列出多元索引列表。
如果要查詢多元索引的描述信息,包括多元索引的字段信息和索引配置等,您可以使用查詢多元索引描述信息功能實(shí)現(xiàn)。具體操作,請(qǐng)參見查詢多元索引描述信息。
如果不再需要使用多元索引,您可以刪除多元索引。具體操作,請(qǐng)參見刪除多元索引。
您還可以使用SQL查詢功能或者通過MaxCompute、Spark、Hive或者HadoopMR、函數(shù)計(jì)算、Flink、PrestoDB等計(jì)算引擎計(jì)算與分析表中數(shù)據(jù)。具體操作,請(qǐng)參見SQL查詢和計(jì)算與分析概述。
附錄:距離度量算法說明
向量的距離度量算法說明請(qǐng)參見下表,其中評(píng)分公式的值越大表示的相似度越大。
MetricType | 評(píng)分公式 | 性能 | 說明 |
歐氏距離 (euclidean) | 較高 | 多維空間中兩個(gè)向量之間的直線距離。出于性能考慮,表格存儲(chǔ)中的歐氏距離算法未進(jìn)行最后的平方根計(jì)算。歐氏距離的評(píng)分越大表示兩個(gè)向量的相似度越大。 | |
點(diǎn)積 (dot_product) | 最高 | 維度相同的兩個(gè)向量的對(duì)應(yīng)坐標(biāo)相乘,然后將結(jié)果相加。點(diǎn)積的評(píng)分越高表示兩個(gè)向量的相似度越大。 Float32向量必須在寫入表前進(jìn)行歸一化(例如使用L2范數(shù)進(jìn)行歸一化),否則會(huì)出現(xiàn)查詢效果差、構(gòu)建向量索引慢、查詢性能差等潛在問題。 | |
余弦相似度 (cosine) | 較低 | 向量空間中兩個(gè)向量間夾角的余弦值。余弦相似度的評(píng)分越高表示兩個(gè)向量的相似度越大。常用于文本數(shù)據(jù)的相似度計(jì)算。 由于0無法作為除數(shù),無法完成余弦相似度的計(jì)算,因此Float32向量的平方和不允許為0 余弦相似度計(jì)算復(fù)雜,推薦您在寫入數(shù)據(jù)到表之前進(jìn)行向量的歸一化,然后使用點(diǎn)積(dot_product)作為向量距離的度量算法。 |
向量歸一化的示例代碼如下:
public static float[] l2normalize(float[] v, boolean throwOnZero) {
double squareSum = 0.0f;
int dim = v.length;
for (float x : v) {
squareSum += x * x;
}
if (squareSum == 0) {
if (throwOnZero) {
throw new IllegalArgumentException("can't normalize a zero-length vector");
} else {
return v;
}
}
double length = Math.sqrt(squareSum);
for (int i = 0; i < dim; i++) {
v[i] /= length;
}
return v;
}