حقل JSON
يتيح لك Milvus تخزين وفهرسة البيانات المنظمة داخل حقل واحد باستخدام نوع البيانات JSON. يتيح ذلك مخططات مرنة مع سمات متداخلة مع استمرار السماح بالتصفية الفعالة عبر فهرسة JSON.
ما هو حقل JSON؟
حقل JSON هو حقل معرّف بالمخطط في Milvus يخزن بيانات منظمة ذات قيمة رئيسية. يمكن أن تتضمن القيم سلاسل أو أرقامًا أو منطقية أو مصفوفات أو كائنات متداخلة بعمق.
إليك مثال لما قد يبدو عليه حقل 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"
}
}
}
}
في هذا المثال
metadataهو حقل JSON المحدد في المخطط.يمكنك تخزين القيم المسطحة (على سبيل المثال
category،in_stock)، والمصفوفات (tags)، والكائنات المتداخلة (supplier).
تعريف حقل JSON في المخطط
لاستخدام حقل JSON، قم بتعريفه بشكل صريح في مخطط المجموعة من خلال تحديد DataType كـ JSON.
يقوم المثال أدناه بإنشاء مجموعة بمخططها الذي يحتوي على هذه الحقول:
المفتاح الأساسي (
product_id)حقل
vector(إلزامي لكل مجموعة)حقل
metadataمن النوعJSON، والذي يمكنه تخزين البيانات المنظمة مثل القيم المسطحة أو المصفوفات أو الكائنات المتداخلة
from pymilvus import MilvusClient, DataType
client = MilvusClient(uri="http://localhost:19530")
# Create schema with a JSON field
schema = client.create_schema(auto_id=False, enable_dynamic_field=True)
schema.add_field(field_name="product_id", datatype=DataType.INT64, is_primary=True)
schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=5)
schema.add_field(field_name="metadata", datatype=DataType.JSON, nullable=True) # JSON field that allows null values
client.create_collection(
collection_name="product_catalog",
schema=schema
)
import io.milvus.v2.client.*;
import io.milvus.v2.service.collection.request.CreateCollectionReq;
import io.milvus.v2.service.collection.request.AddFieldReq;
ConnectConfig config = ConnectConfig.builder()
.uri("http://localhost:19530")
.build();
MilvusClientV2 client = new MilvusClientV2(config);
CreateCollectionReq.CollectionSchema schema = CreateCollectionReq.CollectionSchema.builder()
.enableDynamicField(true)
.build();
schema.addField(AddFieldReq.builder()
.fieldName("product_id")
.dataType(DataType.Int64)
.isPrimaryKey(Boolean.TRUE)
.build());
schema.addField(AddFieldReq.builder()
.fieldName("vector")
.dataType(DataType.FloatVector)
.dimension(5)
.build());
schema.addField(AddFieldReq.builder()
.fieldName("metadata")
.dataType(DataType.JSON)
.isNullable(true)
.build());
CreateCollectionReq requestCreate = CreateCollectionReq.builder()
.collectionName("product_catalog")
.collectionSchema(schema)
.build();
client.createCollection(requestCreate);
import { MilvusClient, DataType } from '@zilliz/milvus2-sdk-node';
const client = new MilvusClient({
address: 'localhost:19530'
});
// Create collection
await client.createCollection({
collection_name: "product_catalog",
fields: [
{
name: "product_id",
data_type: DataType.Int64,
is_primary_key: true,
autoID: false
},
{
name: "vector",
data_type: DataType.FloatVector,
dim: 5
},
{
name: "metadata",
data_type: DataType.JSON,
nullable: true // JSON field that allows null values
}
],
enable_dynamic_field: true
});
import (
"context"
"github.com/milvus-io/milvus/client/v2/entity"
"github.com/milvus-io/milvus/client/v2/milvusclient"
)
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
client, err := milvusclient.New(ctx, &milvusclient.ClientConfig{
Address: "localhost:19530",
})
if err != nil {
return err
}
schema := entity.NewSchema().WithDynamicFieldEnabled(true)
schema.WithField(entity.NewField().
WithName("product_id").pk
WithDataType(entity.FieldTypeInt64).
WithIsPrimaryKey(true),
).WithField(entity.NewField().
WithName("vector").
WithDataType(entity.FieldTypeFloatVector).
WithDim(5),
).WithField(entity.NewField().
WithName("metadata").
WithDataType(entity.FieldTypeJSON).
WithNullable(true),
)
err = client.CreateCollection(ctx, milvusclient.NewCreateCollectionOption("product_catalog", schema))
if err != nil {
return err
}
# restful
export TOKEN="root:Milvus"
export CLUSTER_ENDPOINT="http://localhost:19530"
# 字段定义
export productIdField='{
"fieldName": "product_id",
"dataType": "Int64",
"isPrimary": true,
"autoID": false
}'
export vectorField='{
"fieldName": "vector",
"dataType": "FloatVector",
"typeParams": {
"dim": 5
}
}'
export metadataField='{
"fieldName": "metadata",
"dataType": "JSON",
"isNullable": true
}'
# 构造 schema
export schema="{
\"autoID\": false,
\"enableDynamicField\": true,
\"fields\": [
$productIdField,
$vectorField,
$metadataField
]
}"
# 创建集合
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"collectionName\": \"product_catalog\",
\"schema\": $schema
}"
يمكنك أيضًا تمكين خاصية الحقل الديناميكي لتخزين الحقول غير المعلنة بمرونة، لكنها ليست مطلوبة لكي تعمل حقول JSON. لمزيد من المعلومات، راجع الحقل الديناميكي.
إدراج كيانات ببيانات JSON
بمجرد إنشاء المجموعة، أدرج الكيانات التي تحتوي على كائنات JSON منظمة في الحقل metadata JSON.
entities = [
{
"product_id": 1,
"vector": [0.1, 0.2, 0.3, 0.4, 0.5],
"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"
}
}
}
}
]
client.insert(collection_name="product_catalog", data=entities)
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import io.milvus.v2.service.vector.request.InsertReq;
Gson gson = new Gson();
JsonObject row = new JsonObject();
row.addProperty("product_id", 1);
row.add("vector", gson.toJsonTree(Arrays.asList(0.1, 0.2, 0.3, 0.4, 0.5)));
JsonObject metadata = new JsonObject();
metadata.addProperty("category", "electronics");
metadata.addProperty("brand", "BrandA");
metadata.addProperty("in_stock", true);
metadata.addProperty("price", 99.99);
metadata.addProperty("string_price", "99.99");
metadata.add("tags", gson.toJsonTree(Arrays.asList("clearance", "summer_sale")));
JsonObject supplier = new JsonObject();
supplier.addProperty("name", "SupplierX");
supplier.addProperty("country", "USA");
JsonObject contact = new JsonObject();
contact.addProperty("email", "support@supplierx.com");
contact.addProperty("phone", "+1-800-555-0199");
supplier.add("contact", contact);
metadata.add("supplier", supplier);
row.add("metadata", metadata);
client.insert(InsertReq.builder()
.collectionName("product_catalog")
.data(Collections.singletonList(row))
.build());
const entities = [
{
"product_id": 1,
"vector": [0.1, 0.2, 0.3, 0.4, 0.5],
"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"
}
}
}
}
]
await client.insert({
collection_name: "product_catalog",
data: entities
});
_, err = client.Insert(ctx, milvusclient.NewColumnBasedInsertOption("product_catalog").
WithInt64Column("product_id", []int64{1}).
WithFloatVectorColumn("vector", 5, [][]float32{
{0.1, 0.2, 0.3, 0.4, 0.5},
}).WithColumns(
column.NewColumnJSONBytes("metadata", [][]byte{
[]byte(`{
"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"
}
}
}`),
}),
))
if err != nil {
return err
}
# restful
export TOKEN="root:Milvus"
export CLUSTER_ENDPOINT="http://localhost:19530"
export entities='[
{
"product_id": 1,
"vector": [0.1, 0.2, 0.3, 0.4, 0.5],
"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"
}
}
}
}
]'
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/product_catalog/insert" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"data\": $entities
}"
قيم الفهرسة داخل حقل JSON
لتسريع التصفية العددية على حقول JSON، يدعم Milvus الأنواع التالية من الفهارس:
فهرسمسار JSON - فهرسة مسارات JSON محددة بنوع قياسي معلن.
فهرس JSON المسطح - فهرسة كائن JSON كامل (أو شجرة فرعية) مع الاستدلال التلقائي للنوع.
فهرسة حقول JSON اختيارية. لا يزال بإمكانك الاستعلام أو التصفية حسب مسارات JSON بدون فهرس، ولكن قد يؤدي ذلك إلى أداء أبطأ بسبب البحث بالقوة الغاشمة.
اختر بين فهرس المسار والفهرس المسطحCompatible with Milvus 2.6.x
القدرة |
فهرس مسار JSON |
فهرس JSON المسطح |
|---|---|---|
ما يفهرس |
المسار (المسارات) المحددة التي تسميها |
جميع المسارات المسطحة تحت مسار الكائن |
معالجة النوع |
تعلن |
يجب أن تكون JSON (استدلال النوع التلقائي) |
المصفوفات كـ LHS¹ |
مدعومة |
غير مدعومة |
سرعة الاستعلام |
عالية على المسارات المفهرسة |
عالية، أقل قليلاً في المتوسط |
استخدام القرص |
أقل |
أعلى |
¹ المصفوفات كـ LHS يعني أن الجانب الأيسر من تعبير المرشح هو مصفوفة JSON، على سبيل المثال:
metadata["tags"] == ["clearance", "summer_sale"]
json_contains(metadata["tags"], "clearance")
في هذه الحالات، metadata["tags"] هو مصفوفة. لا تعمل فهرسة JSON المسطحة على تسريع مثل هذه المرشحات - استخدم فهرس مسار JSON مع نوع مصفوفة مصفوفة بدلاً من ذلك.
استخدم فهرس مسار JSON عندما:
أنت تعرف مفاتيح التشغيل السريع للاستعلام مسبقًا.
تحتاج إلى تصفية حيث يكون الجانب الأيسر عبارة عن مصفوفة.
تريد تقليل استخدام القرص.
استخدم فهرس JSON المسطح عندما:
تريد فهرسة شجرة فرعية كاملة (بما في ذلك الجذر).
تتغير بنية JSON الخاصة بك بشكل متكرر.
تريد تغطية استعلام أوسع دون الإعلان عن كل مسار.
فهرسة مسار JSON
لإنشاء فهرس مسار JSON، حدد:
مسار JSON (
json_path): المسار إلى المفتاح أو الحقل المتداخل داخل كائن JSON الذي تريد فهرسته.مثال:
لمفتاح,
metadata["category"]لحقل متداخل,
metadata["contact"]["email"]
هذا يحدد المكان الذي يجب أن يبحث فيه محرك الفهرسة داخل بنية JSON.
نوع JSON cast type (
json_cast_type): نوع البيانات الذي يجب أن يستخدمه Milvus عند تفسير وفهرسة القيمة في المسار المحدد.يجب أن يتطابق هذا النوع مع نوع البيانات الفعلي للحقل الذي تتم فهرسته. إذا كنت ترغب في تحويل نوع البيانات إلى نوع آخر أثناء الفهرسة، ففكر في استخدام دالة الإرسال.
للحصول على قائمة كاملة، انظر أدناه.
أنواع مصبوبات JSON المدعومة
أنواع المصبوب غير حساسة لحالة الأحرف. الأنواع التالية مدعومة:
نوع المصبوب |
الوصف |
مثال قيمة JSON |
|---|---|---|
|
قيمة منطقية |
|
|
قيمة عددية (عدد صحيح أو عائم) |
|
|
قيمة سلسلة |
|
|
صفيف من المنطقيات |
|
|
صفيف من الأرقام |
|
|
صفيف من السلاسل |
|
يجب أن تحتوي المصفوفات على عناصر من نفس النوع للفهرسة المثلى. لمزيد من المعلومات، راجع حقل المصفوفات.
مثال: إنشاء فهارس مسار JSON
باستخدام بنية metadata JSON من مقدمتنا، إليك أمثلة على كيفية إنشاء فهارس على مسارات JSON مختلفة:
# Index the category field as a string
index_params = client.prepare_index_params()
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 to be indexed
"json_cast_type": "varchar" # Data cast type
}
)
# Index the tags array as string array
index_params.add_index(
field_name="metadata",
index_type="AUTOINDEX", # Must be set to AUTOINDEX or INVERTED for JSON path indexing
index_name="tags_array_index", # Unique index name
params={
"json_path": "metadata[\"tags\"]", # Path to the JSON key to be indexed
"json_cast_type": "array_varchar" # Data cast type
}
)
import io.milvus.v2.common.IndexParam;
Map<String,Object> extraParams1 = new HashMap<>();
extraParams1.put("json_path", "metadata[\"category\"]");
extraParams1.put("json_cast_type", "varchar");
indexParams.add(IndexParam.builder()
.fieldName("metadata")
.indexName("category_index")
.indexType(IndexParam.IndexType.AUTOINDEX)
.extraParams(extraParams1)
.build());
Map<String,Object> extraParams2 = new HashMap<>();
extraParams2.put("json_path", "metadata[\"tags\"]");
extraParams2.put("json_cast_type", "array_varchar");
indexParams.add(IndexParam.builder()
.fieldName("metadata")
.indexName("tags_array_index")
.indexType(IndexParam.IndexType.AUTOINDEX)
.extraParams(extraParams2)
.build());
const indexParams = [
{
collection_name: "product_catalog",
field_name: "metadata",
index_name: "category_index",
index_type: "AUTOINDEX", // Can also use "INVERTED" for JSON path indexing
extra_params: {
json_path: 'metadata["category"]',
json_cast_type: "varchar",
},
},
{
collection_name: "product_catalog",
field_name: "metadata",
index_name: "tags_array_index",
index_type: "AUTOINDEX", // Can also use "INVERTED" for JSON path indexing
extra_params: {
json_path: 'metadata["tags"]',
json_cast_type: "array_varchar",
},
},
];
import (
"github.com/milvus-io/milvus/client/v2/index"
)
jsonIndex1 := index.NewJSONPathIndex(index.AUTOINDEX, "varchar", `metadata["category"]`)
.WithIndexName("category_index")
jsonIndex2 := index.NewJSONPathIndex(index.AUTOINDEX, "array_varchar", `metadata["tags"]`)
.WithIndexName("tags_array_index")
indexOpt1 := milvusclient.NewCreateIndexOption("product_catalog", "metadata", jsonIndex1)
indexOpt2 := milvusclient.NewCreateIndexOption("product_catalog", "metadata", jsonIndex2)
# restful
export categoryIndex='{
"fieldName": "metadata",
"indexName": "category_index",
"params": {
"index_type": "AUTOINDEX",
"json_path": "metadata[\\\"category\\\"]",
"json_cast_type": "varchar"
}
}'
export tagsArrayIndex='{
"fieldName": "metadata",
"indexName": "tags_array_index",
"params": {
"index_type": "AUTOINDEX",
"json_path": "metadata[\\\"tags\\\"]",
"json_cast_type": "array_varchar"
}
}'
استخدم دوال JSON cast لتحويل النوعCompatible with Milvus 2.5.14+
إذا كان مفتاح حقل JSON الخاص بك يحتوي على قيم بتنسيق غير صحيح (على سبيل المثال، الأرقام المخزنة كسلاسل)، يمكنك استخدام دوال الإرسال لتحويل القيم أثناء الفهرسة.
دوال الإرسال المدعومة
دوال الإرسال غير حساسة لحالة الأحرف. الأنواع التالية مدعومة:
دالة الإرسال |
تحويل من → إلى |
حالة الاستخدام |
|---|---|---|
|
سلسلة → عددي (مزدوج) |
تحويل |
مثال: تحويل أرقام السلسلة إلى رقمين
# 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
}
)
Map<String,Object> extraParams3 = new HashMap<>();
extraParams3.put("json_path", "metadata[\"string_price\"]");
extraParams3.put("json_cast_type", "double");
extraParams3.put("json_cast_function", "STRING_TO_DOUBLE");
indexParams.add(IndexParam.builder()
.fieldName("metadata")
.indexName("string_to_double_index")
.indexType(IndexParam.IndexType.AUTOINDEX)
.extraParams(extraParams3)
.build());
indexParams.push({
collection_name: "product_catalog",
field_name: "metadata",
index_name: "string_to_double_index",
index_type: "AUTOINDEX", // Can also use "INVERTED"
extra_params: {
json_path: 'metadata["string_price"]',
json_cast_type: "double",
json_cast_function: "STRING_TO_DOUBLE", // Case insensitive
},
});
jsonIndex3 := index.NewJSONPathIndex(index.AUTOINDEX, "double", `metadata["string_price"]`)
.WithIndexName("string_to_double_index")
indexOpt3 := milvusclient.NewCreateIndexOption("product_catalog", "metadata", jsonIndex3)
# restful
export stringToDoubleIndex='{
"fieldName": "metadata",
"indexName": "string_to_double_index",
"params": {
"index_type": "AUTOINDEX",
"json_path": "metadata[\\\"string_price\\\"]",
"json_cast_type": "double",
"json_cast_function": "STRING_TO_DOUBLE"
}
}'
معلمة
json_cast_typeإلزامية ويجب أن تكون نفس نوع مخرجات الدالة المصبوبة.إذا فشل التحويل (على سبيل المثال، سلسلة غير رقمية)، يتم تخطي القيمة ولا تتم فهرستها.
فهرسة JSON المسطحةCompatible with Milvus 2.6.x
بالنسبة للفهرسة المسطحة ل JSON، يقوم Milvus بفهرسة جميع أزواج المفاتيح-القيم داخل مسار كائن JSON (بما في ذلك الكائنات المتداخلة) عن طريق تسطيح بنية JSON واستنتاج نوع كل قيمة تلقائيًا.
كيفية عمل التسطيح واستنتاج النوع
عندما تقوم بإنشاء فهرس JSON مسطح على مسار كائن ما، سيقوم ميلفوس بما يلي:
التسطيح - اجتياز الكائن بشكل متكرر بدءًا من
json_pathالمحدد واستخراج أزواج القيمة الرئيسية المتداخلة كمسارات مؤهلة بالكامل. باستخدام المثال السابقmetadata:"metadata": { "category": "electronics", "price": 99.99, "supplier": { "country": "USA" } }يصبح:
metadata["category"] = "electronics" metadata["price"] = 99.99 metadata["supplier"]["country"] = "USA"استنتاج الأنواع تلقائيًا - لكل قيمة، يحدد ميلفوس نوعها بالترتيب التالي:
unsigned integer → signed integer → floating-point → stringيتم استخدام النوع الأول الذي يناسب القيمة للفهرسة.
هذا يعني أن النوع المستنتج سيكون دائمًا أحد هذه الأنواع الأربعة.
يتم إجراء الاستدلال على النوع لكل مستند، لذلك يمكن أن يكون لنفس المسار أنواع مستنبطة مختلفة عبر المستندات.
بعد الاستدلال على النوع، يتم تمثيل البيانات التي تم تسويتها داخليًا كمصطلحات مع أنواعها المستدل عليها، على سبيل المثال:
("category", Text, "electronics") ("price", Double, 99.99) ("supplier.country", Text, "USA")
مثال: إنشاء فهرس JSON مسطح
# 1. Create a flat index on the root object of the JSON column (covers the entire JSON subtree)
index_params.add_index(
field_name="metadata",
index_type="AUTOINDEX", # Or "INVERTED", same as Path Index
index_name="metadata_flat", # Unique index name
params={
"json_path": 'metadata', # Object path: the root object of the column
"json_cast_type": "JSON" # Key difference: must be "JSON" for Flat Index; case-insensitive
}
)
# 2. Optionally, create a flat index on a sub-object (e.g., supplier subtree)
index_params.add_index(
field_name="metadata",
index_type="AUTOINDEX",
index_name="metadata_supplier_flat",
params={
"json_path": 'metadata["supplier"]', # Object path: sub-object path
"json_cast_type": "JSON"
}
)
// java
// nodejs
// go
# restful
تطبيق الفهارس على المجموعة
بعد تحديد معلمات الفهرس، يمكنك تطبيقها على المجموعة باستخدام create_index():
client.create_index(
collection_name="product_catalog",
index_params=index_params
)
import io.milvus.v2.service.index.request.CreateIndexReq;
client.createIndex(CreateIndexReq.builder()
.collectionName("product_catalog")
.indexParams(indexParams)
.build());
await client.createIndex(indexParams)
indexTask1, err := client.CreateIndex(ctx, indexOpt1)
if err != nil {
return err
}
indexTask2, err := client.CreateIndex(ctx, indexOpt2)
if err != nil {
return err
}
indexTask3, err := client.CreateIndex(ctx, indexOpt3)
if err != nil {
return err
}
# restful
export indexParams="[
$categoryIndex,
$tagsArrayIndex,
$stringToDoubleIndex
]"
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/indexes/create" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--data "{
\"collectionName\": \"product_catalog\",
\"indexParams\": $indexParams
}"
تصفية حسب قيم حقول JSON
بعد إدراج حقول JSON وفهرستها، يمكنك تصفيتها باستخدام تعبيرات التصفية القياسية باستخدام صيغة مسار JSON.
على سبيل المثال
filter = 'metadata["category"] == "electronics"'
filter = 'metadata["price"] > 50'
filter = 'json_contains(metadata["tags"], "featured")'
String filter = 'metadata["category"] == "electronics"';
String filter = 'metadata["price"] > 50';
String filter = 'json_contains(metadata["tags"], "featured")';
let filter = 'metadata["category"] == "electronics"'
let filter = 'metadata["price"] > 50'
let filter = 'json_contains(metadata["tags"], "featured")'
filter := 'metadata["category"] == "electronics"'
filter := 'metadata["price"] > 50'
filter := 'json_contains(metadata["tags"], "featured")'
# restful
export filterCategory='metadata["category"] == "electronics"'
export filterPrice='metadata["price"] > 50'
export filterTags='json_contains(metadata["tags"], "featured")'
لاستخدام هذه التعبيرات في البحث أو الاستعلام، تأكد من
أنك أنشأت فهرسًا على كل حقل متجه.
تم تحميل المجموعة في الذاكرة.
للاطلاع على قائمة كاملة بالمشغلات والتعبيرات المدعومة، راجع مشغلات JSON.
اجمع كل شيء معًا
لقد تعلمت الآن كيفية تعريف وإدراج وفهرسة القيم المنظمة اختياريًا داخل حقل JSON.
لإكمال سير العمل في تطبيق واقعي، ستحتاج أيضًا إلى:
إنشاء فهرس على الحقول المتجهة (إلزامي لكل حقل متجه في مجموعة)
الرجوع إلى تعيين معلمات الفهرس
تحميل المجموعة
راجع تحميل وتحرير
البحث أو الاستعلام باستخدام مرشحات مسار JSON
الأسئلة الشائعة
ما هي الاختلافات بين حقل JSON والحقل الديناميكي؟
حقل JSON هو حقل محدد بالمخطط. يجب أن تعلن الحقل صراحةً في المخطط.
الحقلالديناميكي عبارة عن كائن JSON مخفي (
$meta) يخزن تلقائيًا أي حقل غير محدد في المخطط.
كلاهما يدعمان البنى المتداخلة وفهرسة مسار JSON، لكن الحقول الديناميكية أكثر ملاءمة لهياكل البيانات الاختيارية أو المتطورة.
راجع الحقل الديناميكي للحصول على التفاصيل.
هل هناك أي قيود على حجم حقل JSON؟
نعم. يقتصر كل حقل JSON على 65,536 بايت.
هل يدعم حقل JSON تعيين قيمة افتراضية؟
لا، لا تدعم حقول JSON القيم الافتراضية. ومع ذلك، يمكنك تعيين nullable=True عند تعريف الحقل للسماح بإدخالات فارغة.
راجع Nullable & Default للحصول على التفاصيل.
هل هناك أي اصطلاحات تسمية لمفاتيح حقول JSON؟
نعم، لضمان التوافق مع الاستعلامات والفهرسة:
استخدم الحروف والأرقام والشرطات السفلية فقط في مفاتيح JSON.
تجنب استخدام الأحرف الخاصة أو المسافات أو النقاط (
.،/، إلخ).قد تتسبب المفاتيح غير المتوافقة في حدوث مشكلات في تحليل التعبيرات المرشحة.
كيف يتعامل Milvus مع قيم السلاسل في حقول JSON؟
يقوم Milvus بتخزين قيم السلسلة تمامًا كما تظهر في مدخلات JSON - بدون تحويل دلالي. قد تؤدي السلاسل المقتبسة بشكل غير صحيح إلى حدوث أخطاء أثناء التحليل.
أمثلة على السلاسل الصحيحة:
"a\"b", "a'b", "a\\b"
أمثلة على السلاسل غير الصالحة:
'a"b', 'a\'b'
ما هو منطق التصفية الذي يستخدمه Milvus لمسارات JSON المفهرسة؟
الفهرسة العددية:
إذا تم إنشاء فهرس باستخدام
json_cast_type="double"، فإن شروط التصفية الرقمية فقط (على سبيل المثال،>،<،== 42) سوف تستفيد من الفهرس. قد تعود الشروط غير العددية إلى الفحص بالقوة الغاشمة.فهرسة السلسلة:
إذا كان الفهرس يستخدم
json_cast_type="varchar"، فإن شروط تصفية السلاسل فقط هي التي ستستفيد من الفهرس؛ أما الأنواع الأخرى فقد تعود إلى الفحص بالقوة الغاشمة.الفهرسة المنطقية:
تتصرف الفهرسة المنطقية بشكل مشابه لفهرسة السلسلة، مع استخدام الفهرسة فقط عندما يتطابق الشرط بشكل صارم مع صواب أو خطأ.
ماذا عن الدقة الرقمية عند فهرسة حقول JSON؟
يقوم ميلفوس بتخزين جميع القيم الرقمية المفهرسة على شكل مضاعفات.
إذا تجاوزت القيمة الرقمية 2^53، فقد تفقد الدقة. يمكن أن يؤدي فقدان الدقة هذا إلى عدم مطابقة استعلامات التصفية للقيم خارج النطاق تمامًا.
هل يمكنني إنشاء فهارس متعددة على نفس مسار JSON بأنواع مختلفة من الإرسال؟
لا، كل مسار JSON يدعم فهرساً واحداً فقط. يجب عليك اختيار فهرس واحد json_cast_type يطابق بياناتك. لا يتم دعم إنشاء فهارس متعددة على نفس المسار بأنواع مختلفة من أنواع المسبوكات.
ماذا لو كانت القيم في مسار JSON ذات أنواع غير متناسقة؟
يمكن أن تؤدي الأنواع غير المتسقة عبر الكيانات إلى فهرسة جزئية. على سبيل المثال، إذا تم تخزين metadata["price"] على شكل رقم (99.99) وسلسلة ("99.99")، وتم تعريف الفهرس بـ json_cast_type="double" ، سيتم فهرسة القيم الرقمية فقط. سيتم تخطي إدخالات شكل السلسلة ولن تظهر في نتائج التصفية.
هل يمكنني استخدام فلاتر بنوع مختلف عن نوع المصبوب المفهرس؟
إذا كان تعبير عامل التصفية الخاص بك يستخدم نوعًا مختلفًا عن نوع الفهرس json_cast_type ، فلن يستخدم النظام الفهرس، وقد يعود إلى الفحص الأبطأ - إذا سمحت البيانات بذلك. للحصول على أفضل أداء، قم دائمًا بمحاذاة تعبير التصفية الخاص بك مع نوع الفهرس المصبوب.