使用 Python SDK 為資料表建立多元索引,並配置索引欄位、預排序、生命週期、虛擬列及摘要與高亮。
前提條件
安裝Tablestore Python SDK並初始化用戶端。
已建立資料表,並將最大版本數設定為 1。
資料表的資料生命週期為 -1,或已禁止通過
UpdateRow更新資料。
功能說明
調用 create_search_index 方法為指定資料表建立多元索引。同一資料表可以建立多個多元索引。請求中需要指定資料表、索引名稱和完整的索引配置,並將需要查詢的列添加到 fields。索引欄位的資料類型必須與資料表中對應列的資料類型匹配,支援的類型請參見資料類型。
create_search_index(table_name, index_name, index_meta)
建立多元索引是非同步作業。請求成功後,等待索引資料同步完成,再使用索引查詢資料。
以下樣本為 example_table 建立包含 Keyword 和 Long 欄位的 example_index。未設定預排序和生命週期時,索引預設按主鍵排序,資料永不到期。
table_name = "example_table"
index_name = "example_index"
fields = [
FieldSchema("category", FieldType.KEYWORD, index=True),
FieldSchema("price", FieldType.LONG, index=True),
]
index_meta = SearchIndexMeta(fields)
client.create_search_index(table_name, index_name, index_meta)
參數說明
create_search_index 包含以下參數。
|
名稱 |
類型 |
說明 |
|
table_name(必選) |
|
資料表名稱。 |
|
index_name(必選) |
|
多元索引名稱。 |
|
index_meta(必選) |
|
索引配置。 |
索引配置
index_meta 的類型為 SearchIndexMeta,包含以下參數。
|
名稱 |
類型 |
說明 |
|
fields(必選) |
|
索引欄位列表。 |
|
index_setting(可選) |
|
索引設定。 |
|
index_sort(可選) |
|
索引預排序配置。不設定且索引不包含 Nested 欄位時,系統預設按主鍵排序。Nested 索引不支援預排序。 |
|
time_to_live(可選) |
|
索引資料的生命週期,單位為秒,預設值為 -1。取值為 -1 或不小於 86400 的整數;-1 表示資料永不到期。設定非 -1 值時,必須禁止通過 |
索引欄位
index_meta.fields[] 中每個元素的類型為 FieldSchema,包含以下參數。
|
名稱 |
類型 |
說明 |
|
field_name(必選) |
|
索引欄位名稱,可以對應主鍵列或屬性列。 |
|
field_type(必選) |
|
索引欄位的資料類型。多層邏輯關係使用 Nested 類型,JSON 格式資料使用 JSON 類型,地理位置資料使用 Geo-point 類型。 |
|
index(可選) |
|
是否為欄位建立倒排索引或空間索引,預設值為 |
|
enable_highlighting(可選) |
|
是否啟用摘要與高亮。僅 Text 欄位支援,預設值為 |
|
analyzer(可選) |
|
Text 欄位使用的分詞器。不設定時使用單字分詞。 |
|
analyzer_parameter(可選) |
|
分詞器參數。設定 |
|
enable_sort_and_agg(可選) |
|
是否啟用排序與統計彙總,預設值為 |
|
is_array(可選) |
|
欄位是否為數組,預設值為 |
|
sub_field_schemas(可選) |
|
Nested 或 JSON 欄位的子欄位列表。Nested 或 JSON 欄位必須配置。 |
|
is_virtual_field(可選) |
|
欄位是否為虛擬列,預設值為 |
|
source_fields(可選) |
|
虛擬列映射的資料表欄位列表。設定虛擬列時必須配置,當前僅支援一個源欄位。 |
|
date_formats(可選) |
|
Date 欄位支援的日期格式列表。Date 欄位必須配置。 |
|
vector_options(可選) |
|
Vector 欄位的向量配置,包括資料類型、維度和距離度量演算法。Vector 欄位必須配置。 |
|
json_type(可選) |
|
JSON 欄位的索引類型,取值為 |
|
text_similarity(可選) |
|
Text 欄位的相似性演算法,取值為 |
向量配置
index_meta.fields[].vector_options 的類型為 VectorOptions,包含以下參數。
|
名稱 |
類型 |
說明 |
|
data_type(必選) |
|
向量資料類型,當前僅支援 |
|
dimension(必選) |
|
向量維度,最大值為 4096。 |
|
metric_type(必選) |
|
距離度量演算法,取值為 |
索引設定
index_meta.index_setting 的類型為 IndexSetting,包含以下參數。
|
名稱 |
類型 |
說明 |
|
routing_fields(可選) |
|
自訂路由欄位。可以指定一個或多個主鍵列,通常設定一個。設定多個路由欄位時,系統將欄位值拼接為一個值。系統根據路由欄位值計算索引資料的分布位置,值相同的記錄寫入同一資料分區。 |
預排序配置
index_meta.index_sort 的類型為 Sort,包含以下參數。
|
名稱 |
類型 |
說明 |
|
sorters(必選) |
|
預排序方式列表。 |
主鍵排序
index_meta.index_sort.sorters[] 中類型為 PrimaryKeySort 的元素用於按主鍵預排序,包含以下參數。
|
名稱 |
類型 |
說明 |
|
sort_order(可選) |
|
主鍵排序次序,取值為 |
欄位值排序
index_meta.index_sort.sorters[] 中類型為 FieldSort 的元素用於按欄位值預排序,包含以下參數。
|
名稱 |
類型 |
說明 |
|
field_name(必選) |
|
用於預排序的欄位名稱。 |
|
sort_order(可選) |
|
欄位值排序次序,取值為 |
|
sort_mode(可選) |
|
欄位存在多個值時使用的排序方式。 |
情境樣本
設定索引預排序
以下樣本按 created_at 欄位升序預排序索引資料。
table_name = "example_table"
index_name = "example_index"
fields = [
FieldSchema("category", FieldType.KEYWORD, index=True),
FieldSchema(
"created_at",
FieldType.LONG,
index=True,
enable_sort_and_agg=True,
),
]
index_sort = Sort([FieldSort("created_at", SortOrder.ASC)])
index_meta = SearchIndexMeta(fields, index_sort=index_sort)
client.create_search_index(table_name, index_name, index_meta)
設定索引生命週期
以下樣本將索引生命週期設定為 7 天。
table_name = "example_table"
index_name = "example_index"
fields = [
FieldSchema("category", FieldType.KEYWORD, index=True),
FieldSchema("price", FieldType.LONG, index=True),
]
index_meta = SearchIndexMeta(fields, time_to_live=7 * 24 * 60 * 60)
client.create_search_index(table_name, index_name, index_meta)
設定分詞
以下樣本為 Text 欄位 description 設定分隔字元分詞,並使用半形逗號(,)分隔寫入內容。
table_name = "example_table"
index_name = "example_index"
fields = [
FieldSchema("category", FieldType.KEYWORD, index=True),
FieldSchema(
"description",
FieldType.TEXT,
index=True,
analyzer=AnalyzerType.SPLIT,
analyzer_parameter=SplitAnalyzerParameter(","),
),
]
index_meta = SearchIndexMeta(fields)
client.create_search_index(table_name, index_name, index_meta)
建立向量欄位
以下樣本建立維度為 4、使用點積計算相似性的 Vector 欄位 embedding。
table_name = "example_table"
index_name = "example_index"
fields = [
FieldSchema("category", FieldType.KEYWORD, index=True),
FieldSchema(
"embedding",
FieldType.VECTOR,
index=True,
vector_options=VectorOptions(
data_type=VectorDataType.VD_FLOAT_32,
dimension=4,
metric_type=VectorMetricType.VM_DOT_PRODUCT,
),
),
]
index_meta = SearchIndexMeta(fields)
client.create_search_index(table_name, index_name, index_meta)
建立虛擬列
以下樣本將 Keyword 欄位 category 映射為 Long 虛擬列,並將 Long 欄位 price 映射為 Keyword 虛擬列。
table_name = "example_table"
index_name = "example_index"
fields = [
FieldSchema("category", FieldType.KEYWORD, index=True),
FieldSchema(
"category_as_long",
FieldType.LONG,
index=True,
is_virtual_field=True,
source_fields=["category"],
),
FieldSchema("price", FieldType.LONG, index=True),
FieldSchema(
"price_as_keyword",
FieldType.KEYWORD,
index=True,
is_virtual_field=True,
source_fields=["price"],
),
]
index_meta = SearchIndexMeta(fields)
client.create_search_index(table_name, index_name, index_meta)
啟用摘要與高亮
以下樣本為 Text 欄位 description 啟用摘要與高亮。
table_name = "example_table"
index_name = "example_index"
fields = [
FieldSchema("category", FieldType.KEYWORD, index=True),
FieldSchema("price", FieldType.LONG, index=True),
FieldSchema(
"description",
FieldType.TEXT,
index=True,
enable_highlighting=True,
),
]
index_meta = SearchIndexMeta(fields)
client.create_search_index(table_name, index_name, index_meta)