نظرة عامة على حقل JSON
عند إنشاء تطبيقات مثل كتالوجات المنتجات أو أنظمة إدارة المحتوى أو محركات تفضيلات المستخدم، غالبًا ما تحتاج إلى تخزين بيانات وصفية مرنة إلى جانب تضمينات المتجهات. تختلف سمات المنتج حسب الفئة، وتتطور تفضيلات المستخدم بمرور الوقت، ويكون لخصائص المستند هياكل متداخلة معقدة. تعمل حقول JSON في Milvus على حل هذا التحدي من خلال السماح لك بتخزين البيانات المنظمة المرنة والاستعلام عنها دون التضحية بالأداء.
ما هو حقل JSON؟
حقل JSON هو نوع بيانات معرّف بالمخطط (DataType.JSON) في Milvus يخزن بيانات منظمة ذات قيمة رئيسية. على عكس أعمدة قاعدة البيانات الجامدة التقليدية، تستوعب حقول JSON الكائنات المتداخلة والمصفوفات وأنواع البيانات المختلطة مع توفير خيارات فهرسة متعددة للاستعلامات السريعة.
مثال على بنية حقول 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 مقابل الحقل الديناميكي
من نقاط الالتباس الشائعة هي الفرق بين حقل JSON والحقل الديناميكي. بينما يرتبط كلاهما بـ JSON، إلا أنهما يخدمان أغراضًا مختلفة.
يلخص الجدول أدناه الاختلافات الرئيسية بين حقل JSON والحقل الديناميكي:
الميزة |
حقل JSON |
الحقل الديناميكي |
|---|---|---|
تعريف المخطط |
حقل قياسي يجب الإعلان عنه صراحةً في مخطط المجموعة بنوع |
حقل JSON مخفي (يسمى |
حالة الاستخدام |
تخزين البيانات المنظمة حيث يكون المخطط معروفًا ومتسقًا. |
تخزين البيانات المرنة أو المتطورة أو شبه المنظمة التي لا تتناسب مع مخطط ثابت. |
التحكم |
تتحكم في اسم الحقل وبنيته. |
تدار من قبل النظام للحقول غير المحددة. |
الاستعلام |
استعلام باستخدام اسم الحقل أو المفتاح المستهدف داخل حقل JSON: |
الاستعلام مباشرةً باستخدام مفتاح الحقل الديناميكي: |
العمليات الأساسية
يتضمن سير العمل الأساسي لاستخدام حقل JSON تعريفه في المخطط الخاص بك، وإدراج البيانات، ثم الاستعلام عن البيانات باستخدام تعبيرات تصفية محددة.
تعريف حقل JSON
لاستخدام حقل JSON، قم بتعريفه صراحةً في مخطط مجموعتك عند إنشاء المجموعة. يوضح المثال التالي كيفية إنشاء مجموعة بحقل metadata من النوع DataType.JSON:
from pymilvus import MilvusClient, DataType
client = MilvusClient(uri="http://localhost:19530") # Replace with your server address
# Create schema
schema = client.create_schema(auto_id=False, enable_dynamic_field=True)
schema.add_field(field_name="product_id", datatype=DataType.INT64, is_primary=True) # Primary field
schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=5) # Vector field
# Define a JSON field that allows null values
schema.add_field(field_name="metadata", datatype=DataType.JSON, nullable=True)
client.create_collection(
collection_name="product_catalog",
schema=schema
)
في هذا المثال، يسمح حقل JSON المعرّف في مخطط المجموعة بقيم فارغة مع nullable=True. لمزيد من التفاصيل، ارجع إلى لاغية وافتراضية.
إدراج البيانات
بمجرد إنشاء المجموعة، قم بإدراج الكيانات التي تحتوي على كائنات JSON منظمة في حقل JSON المعين. يجب تنسيق بياناتك كقائمة من القواميس.
entities = [
{
"product_id": 1,
"vector": [0.1, 0.2, 0.3, 0.4, 0.5],
"metadata": { # JSON field
"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)
عمليات التصفية
قبل أن تتمكن من إجراء عمليات تصفية على حقول JSON، تأكد من
قمت بإنشاء فهرس على كل حقل متجه.
تم تحميل المجموعة في الذاكرة.
index_params = client.prepare_index_params()
index_params.add_index(
field_name="vector",
index_type="AUTOINDEX",
index_name="vector_index",
metric_type="COSINE"
)
client.create_index(collection_name="product_catalog", index_params=index_params)
client.load_collection(collection_name="product_catalog")
بمجرد استيفاء هذه المتطلبات، يمكنك استخدام التعبيرات أدناه لتصفية مجموعتك استنادًا إلى القيم الموجودة في حقل JSON. تستفيد تعبيرات التصفية هذه من بناء جملة مسار JSON محددة وعوامل تشغيل مخصصة.
التصفية باستخدام بناء جملة مسار JSON
للاستعلام عن مفتاح معيّن، استخدم ترميز الأقواس للوصول إلى مفاتيح JSON: json_field_name["key"]. للمفاتيح المتداخلة، قم بتسلسلها معًا: json_field_name["key1"]["key2"].
للتصفية للكيانات التي يكون فيها category هو "electronics":
# Define filter expression
filter = 'metadata["category"] == "electronics"'
client.search(
collection_name="product_catalog", # Collection name
data=[[0.1, 0.2, 0.3, 0.4, 0.5]], # Query vector (must match collection's vector dim)
limit=5, # Max. number of results to return
filter=filter, # Filter expression
output_fields=["product_id", "metadata"] # Fields to include in the search results
)
للتصفية للكيانات حيث يكون المفتاح المتداخل supplier["country"] هو "USA":
# Define filter expression
filter = 'metadata["supplier"]["country"] == "USA"'
res = client.search(
collection_name="product_catalog", # Collection name
data=[[0.1, 0.2, 0.3, 0.4, 0.5]], # Query vector (must match collection's vector dim)
limit=5, # Max. number of results to return
filter=filter, # Filter expression
output_fields=["product_id", "metadata"] # Fields to include in the search results
)
print(res)
التصفية باستخدام مشغلات خاصة ب JSON
يوفر Milvus أيضًا عوامل تشغيل خاصة للاستعلام عن قيم المصفوفات على مفاتيح حقول JSON محددة. على سبيل المثال
json_contains(identifier, expr): التحقق من وجود عنصر معين أو مصفوفة فرعية محددة داخل مصفوفة JSONjson_contains_all(identifier, expr): يضمن أن جميع عناصر تعبير JSON المحدد موجودة في الحقلjson_contains_any(identifier, expr): يقوم بتصفية الكيانات التي يوجد فيها عنصر واحد على الأقل من تعبير JSON داخل الحقل
للعثور على منتج يحتوي على القيمة "summer_sale" تحت المفتاح tags
# Define filter expression
filter = 'json_contains(metadata["tags"], "summer_sale")'
res = client.search(
collection_name="product_catalog", # Collection name
data=[[0.1, 0.2, 0.3, 0.4, 0.5]], # Query vector (must match collection's vector dim)
limit=5, # Max. number of results to return
filter=filter, # Filter expression
output_fields=["product_id", "metadata"] # Fields to include in the search results
)
print(res)
للعثور على منتج يحتوي على قيمة واحدة على الأقل من القيم "electronics" أو "new" أو "clearance" تحت المفتاح tags:
# Define filter expression
filter = 'json_contains_any(metadata["tags"], ["electronics", "new", "clearance"])'
res = client.search(
collection_name="product_catalog", # Collection name
data=[[0.1, 0.2, 0.3, 0.4, 0.5]], # Query vector (must match collection's vector dim)
limit=5, # Max. number of results to return
filter=filter, # Filter expression
output_fields=["product_id", "metadata"] # Fields to include in the search results
)
print(res)
لمزيد من المعلومات حول عوامل التشغيل الخاصة بـ JSON، راجع عوامل تشغيل JSON.
التالي: تسريع استعلامات JSON
بشكل افتراضي، تقوم الاستعلامات على حقول JSON بدون تسريع بإجراء مسح كامل لجميع الصفوف، الأمر الذي قد يكون بطيئًا على مجموعات البيانات الكبيرة. لتسريع استعلامات JSON، يوفر Milvus ميزات متقدمة للفهرسة وتحسين التخزين.
يلخص الجدول أدناه الاختلافات بينهما والسيناريوهات الأفضل استخدامًا:
التقنية |
الأفضل ل |
تسريع المصفوفات |
الملاحظات |
|---|---|---|---|
فهرسة JSON |
مجموعة صغيرة من المفاتيح التي يتم الوصول إليها بشكل متكرر، مصفوفات على مفتاح مصفوفة محدد |
نعم (على مفتاح صفيف مفهرس) |
يجب التحديد المسبق للمفاتيح، الصيانة مطلوبة إذا تطور المخطط |
تمزيق JSON |
تسريع عام عبر العديد من المفاتيح، مرن للاستعلامات المتنوعة |
لا (لا يسرّع القيم داخل المصفوفات) |
تكوين تخزين إضافي، لا تزال المصفوفات بحاجة إلى فهرس لكل مفتاح |
فهرس NGRAM |
عمليات بحث أحرف البدل، مطابقة السلاسل الفرعية في الحقول النصية |
غير متاح |
ليس للمرشحات الرقمية/النطاقية |
نصيحة: يمكنك الجمع بين هذه الأساليب - على سبيل المثال، استخدم تمزيق JSON لتسريع الاستعلام الواسع، وفهرسة JSON لمفاتيح المصفوفات عالية التردد، وفهرسة NGRAM للبحث النصي المرن.
للحصول على تفاصيل التنفيذ، راجع:
الأسئلة الشائعة
هل هناك أي قيود على حجم حقل 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'