JSON 索引
在 Milvus 中,JSON 欄位提供了一種靈活的方式來儲存結構化的元資料。如果沒有索引,對 JSON 欄位的查詢需要全集掃描,隨著資料集的增長,速度會變慢。JSON 索引通過在 JSON 資料中創建索引來實現快速查找。
JSON 索引適用於
具有一致、已知鍵的結構化模式
特定 JSON 路徑上的等值和範圍查詢
需要精確控制索引關鍵的場景
加速目標查詢的儲存效率
對於具有多樣查詢模式的複雜 JSON 文件,請考慮JSON Shredding作為替代方案。
JSON 索引語法
當您建立 JSON 索引時,您需要指定
JSON 路徑:您想要索引的資料的確切位置
資料鑄造類型:如何解釋和儲存索引值
可選的類型轉換:如果需要,在索引過程中轉換資料
以下是索引 JSON 欄位的語法:
# Prepare index params
index_params = MilvusClient.prepare_index_params()
index_params.add_index(
field_name="<json_field_name>", # Name of the JSON field
index_type="AUTOINDEX", # Must be AUTOINDEX or INVERTED
index_name="<unique_index_name>", # Index name
params={
"json_path": "<path_to_json_key>", # Specific key to be indexed within JSON data
"json_cast_type": "<data_type>", # Data type to use when interpreting and indexing the value
# "json_cast_function": "<cast_function>" # Optional: convert key values into a target type at index time
}
)
參數 |
說明 |
值/範例 |
|---|---|---|
|
收集模式中 JSON 欄位的名稱。 |
|
|
對於 JSON 索引,必須是 |
|
|
此索引的唯一識別碼。 |
|
|
您要在 JSON 物件中建立索引的關鍵路徑。 |
|
|
解釋和索引值時要使用的資料類型。必須與 key 的實際資料類型相符。 |
|
|
(可選)在編制索引時,將原始關鍵值轉換為目標類型。只有當鍵值以錯誤的格式儲存,且您想要在索引期間轉換資料類型時,才需要此設定。 如需可用的轉換函數清單,請參閱下面的支援轉換函數。 |
|
支援的轉換類型
Milvus 支援下列資料類型在索引時轉換。這些類型可確保您的資料被正確詮釋,以進行有效的篩選。
轉換類型 |
說明 |
範例 JSON 值 |
|---|---|---|
|
用於索引布林值,使查詢可以篩選真/假條件。 |
|
|
用於數值,包括整數和浮點數。它可以根據範圍或等值進行篩選(例如: |
|
|
用於索引字串值,常用於以文字為基礎的資料,例如名稱、類別或 ID。 |
|
|
用於索引布林值陣列。 |
|
|
用於索引數值陣列。 |
|
|
用於索引字串陣列,非常適合標籤或關鍵字清單。 |
|
|
整個 JSON 物件或子物件,具有自動類型推斷和扁平化功能。 索引整個 JSON 物件會增加索引大小。對於多 key 的情況,請考慮JSON Shredding。 |
任何 JSON 物件 |
陣列應包含相同類型的元素,以獲得最佳索引。如需詳細資訊,請參閱陣列欄位。
支援的轉換函數
如果您的 JSON 欄位 key 包含格式不正確的值 (例如,以字串形式儲存的數字),您可以傳送一個 cast 函數到json_cast_function 參數,以便在建立索引時轉換這些值。
轉換函數不區分大小寫。支援下列函數:
轉換函數 |
轉換自 → 轉換為 |
使用範例 |
|---|---|---|
|
字串 → 數字 (雙數) |
轉換 |
如果轉換失敗 (例如:非數字字串),該值會被跳過,不會被索引。
建立 JSON 索引
本節使用實例說明如何在不同類型的 JSON 資料上建立索引。所有範例都使用以下所示的 JSON 結構範例,並假設您已建立與MilvusClient的連線,且已正確定義集合模式。
JSON 結構範例
{
"metadata": {
"category": "electronics",
"brand": "BrandA",
"in_stock": true,
"price": 99.99,
"string_price": "99.99",
"tags": ["clearance", "summer_sale"],
"supplier": {
"name": "SupplierX",
"country": "USA",
"contact": {
"email": "support@supplierx.com",
"phone": "+1-800-555-0199"
}
}
}
}
基本設定
在建立任何 JSON 索引之前,請準備好您的索引參數:
# Prepare index params
index_params = MilvusClient.prepare_index_params()
範例 1:為一個簡單的 JSON 鍵建立索引
在category 欄位建立索引,以便依產品類別快速篩選:
index_params.add_index(
field_name="metadata",
index_type="AUTOINDEX", # Must be set to AUTOINDEX or INVERTED for JSON path indexing
index_name="category_index", # Unique index name
params={
"json_path": 'metadata["category"]', # Path to the JSON key
"json_cast_type": "varchar" # Data cast type
}
)
範例 2:為嵌套關鍵字建立索引
在深度嵌套的email 欄位上建立索引,以便搜尋供應商聯絡人:
# Index the nested key
index_params.add_index(
field_name="metadata",
index_type="AUTOINDEX", # Must be set to AUTOINDEX or INVERTED for JSON path indexing
index_name="email_index", # Unique index name
params={
"json_path": 'metadata["supplier"]["contact"]["email"]', # Path to the nested JSON key
"json_cast_type": "varchar" # Data cast type
}
)
範例 3:在建立索引時轉換資料類型
有時數字資料會被錯誤地儲存為字串。使用STRING_TO_DOUBLE 轉換函式來正確轉換並建立索引:
# Convert string numbers to double for indexing
index_params.add_index(
field_name="metadata",
index_type="AUTOINDEX", # Must be set to AUTOINDEX or INVERTED for JSON path indexing
index_name="string_to_double_index", # Unique index name
params={
"json_path": 'metadata["string_price"]', # Path to the JSON key to be indexed
"json_cast_type": "double", # Data cast type
"json_cast_function": "STRING_TO_DOUBLE" # Cast function; case insensitive
}
)
重要:如果任何文件的轉換失敗 (例如,非數字字串如"invalid"),該文件的值將從索引中排除,並且不會出現在篩選結果中。
範例 4:索引整個物件
索引整個 JSON 物件,以便能夠查詢其中的任何欄位。當您使用json_cast_type="JSON" 時,系統會自動
將 JSON 結構扁平化:巢狀物件會轉換為平面路徑,以便進行有效率的索引
推斷資料類型:每個值會根據其內容自動歸類為數值、字串、布林值或日期。
建立全面的涵蓋範圍:物件中的所有鍵和巢狀路徑都可搜尋
對於上面的JSON 結構範例,可索引整個metadata 物件:
# Index the entire JSON object
index_params.add_index(
field_name="metadata",
index_type="AUTOINDEX",
index_name="metadata_full_index",
params={
"json_path": "metadata",
"json_cast_type": "JSON"
}
)
您也可以只索引 JSON 結構的一部分,例如所有supplier 資訊:
# Index a sub-object
index_params.add_index(
field_name="metadata",
index_type="AUTOINDEX",
index_name="supplier_index",
params={
"json_path": 'metadata["supplier"]',
"json_cast_type": "JSON"
}
)
套用索引設定
定義所有索引參數後,將其套用至您的集合:
# Apply all index configurations to the collection
MilvusClient.create_index(
collection_name="your_collection_name",
index_params=index_params
)
索引建立完成後,您的 JSON 欄位查詢將會自動使用這些索引,以獲得更快的效能。
常見問題
如果查詢的篩選表達式使用的類型與索引的鑄模類型不同,會發生什麼情況?
如果您的篩選表達式使用的類型與索引的json_cast_type 不同,Milvus 將不會使用索引,如果資料允許的話,可能會退回到較慢的強制掃描。為了獲得最佳效能,請務必使您的篩選表達式與索引的類型一致。例如,如果使用json_cast_type="double" 建立數值索引,則只有數值篩選條件會使用該索引。
在建立 JSON 索引時,如果不同實體的 JSON key 具有不一致的資料類型,該怎麼辦?
不一致的類型可能會導致部分索引。例如,如果metadata["price"] 欄位同時以數字 (99.99) 和字串 ("99.99") 儲存,而您以json_cast_type="double" 建立索引,則只有數字值會被索引。字串形式的項目將會被跳過,並且不會出現在篩選結果中。
我可以在同一個 JSON key 上建立多個索引嗎?
不可以,每個 JSON key 只支援一個索引。您必須選擇符合您資料的單一json_cast_type 。但是,您可以在整個 JSON 物件上建立索引,也可以在該物件中的巢狀關鍵上建立索引。
JSON 欄位是否支援設定預設值?
不,JSON 欄位不支援預設值。但是,您可以在定義欄位時設定nullable=True ,以允許空項目。如需詳細資訊,請參閱Nullable & Default。