نظرة عامة على حقول 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

الحقل الديناميكي

تعريف المخطط

حقل قياسي يجب الإعلان عنه صراحةً في مخطط المجموعة بنوع DataType.JSON.

حقل JSON مخفي (يُسمى $meta) يقوم تلقائيًا بتخزين الحقول غير المُعلنة.

حالة الاستخدام

يخزن البيانات المنظمة التي يكون مخططها معروفًا ومتسقًا.

يخزن البيانات المرنة أو المتطورة أو شبه المنظمة التي لا تتوافق مع مخطط ثابت.

التحكم

يمكنك التحكم في اسم الحقل وبنيته.

تتم إدارتها من قبل النظام بالنسبة للحقول غير المحددة.

الاستعلام

يمكنك الاستعلام باستخدام اسم الحقل الخاص بك أو المفتاح المستهدف داخل حقل JSON: metadata["key"].

الاستعلام مباشرةً باستخدام مفتاح الحقل الديناميكي: "dynamic_key" أو عبر $meta: $meta["dynamic_key"]

العمليات الأساسية

يتضمن سير العمل الأساسي لاستخدام حقل 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 المُعرَّف في مخطط المجموعة بالقيم الفارغة (null) مع nullable=True. لمزيد من التفاصيل، راجع «القيم الفارغة ( Nullable) والقيم الافتراضية (Default)».

إدراج البيانات

بمجرد إنشاء المجموعة، قم بإدراج الكيانات التي تحتوي على كائنات 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): يتحقق من وجود عنصر معين أو مصفوفة فرعية داخل مصفوفة JSON

  • json_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 ميزات متقدمة للفهرسة وتحسين التخزين.

بدءًا من Milvus 3.0.0، تم إيقاف استخدام فهرسة JSON للكائن بأكمله (json_cast_type="JSON")، والمعروفة أيضًا باسم فهرسة JSON المسطحة. لا يزال يتم دعم الفهارس الحالية وطلبات إنشاء الفهارس الجديدة من أجل التوافق، ولكن لم يعد يُنصح باستخدام هذا الوضع لأحمال العمل الجديدة. استخدم فهرسة مسار JSON لمسارات الاستعلام المعروفة، أو ضع في اعتبارك استخدام تقنية JSON Shredding لتسريع الاستعلامات على نطاق واسع عبر المستندات المعقدة أو المتغيرة.

يلخص الجدول أدناه الاختلافات بينهما وسيناريوهات الاستخدام الأمثل:

التقنية

الأفضل لـ

تسريع المصفوفات

ملاحظات

فهرسة 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'