مشاركة عبر


Manage indexing in Azure DocumentDB

الفهارس هي هياكل تحسن سرعة استرجاع البيانات من خلال توفير وصول سريع إلى الحقول في المجموعة. تعمل هذه الأنظمة عن طريق إنشاء مجموعة مرتبة من المؤشرات للبيانات، غالبا بناء على الحقول الرئيسية. يستخدم Azure DocumentDB الفهارس في سياقات متعددة، بما في ذلك دفع الاستعلام، والقيود الفريدة، والتقسيم الجزئي.

Important

حقل "_id" هو الحقل الوحيد المفهرس افتراضيا ويمكن أن يكون 2 KBالحد الأقصى لحجم الحقل هو . يوصى بإضافة فهارس إضافية تعتمد على مرشحات ومحسومات الاستعلام لتحسين الأداء.

أنواع الفهارس

للتبسيط، دعونا نأخذ مثالا على تطبيق مدونة مع الإعداد التالي:

  • اسم قاعدة البيانات: cosmicworks
  • اسم المجموعة: products

هذا التطبيق النموذجي يخزن المقالات كوثائق بالبنية التالية. كل الأمثلة المقتبسة تستخدم هيكل هذه المجموعة بشكل أكبر.

{
  "_id": ObjectId("617a34e7a867530bff1b2346"),
  "title": "Azure DocumentDB - A Game Changer",
  "content": "Azure DocumentDB is a globally distributed, multi-model database service.",
  "author": {lastName: "Doe", firstName: "John"},
  "category": "Technology",
  "launchDate": ISODate("2024-06-24T10:08:20.000Z"),
  "published": true
}

مؤشرات الحقل الواحد

تخزن فهارس الحقل الواحد معلومات من حقل واحد في مجموعة. لا يهم ترتيب الفرز لفهرس الحقل الفردي. _id الحقل يبقى مفهرسا بشكل افتراضي.

يدعم Azure DocumentDB إنشاء الفهرس في التالي

  • حقول المستندات على المستوى الأعلى.
  • مستند مدمج.
  • الحقول داخل المستند المدمج.

ينشئ الأمر التالي فهرس حقل واحد على الحقل author ، ويقوم الأمر التالي بإنشائه على حقل firstNameمدمج .

use cosmicworks

db.products.createIndex({"author": 1})

// indexing embedded property
db.products.createIndex({"author.firstName": -1})

يمكن لاستعلام واحد استخدام عدة فهارس لحقل واحد حيثما توفرت الفرصة.

إشعار

يتيح Azure DocumentDB إنشاء حد أقصى 64 فهرسة على المجموعة. اعتمادا على المستوى، يمكننا التخطيط لتمديد حتى 300 فهرس عند الطلب.

الفهارس المركبة

تحسن الفهارس المركبة أداء قواعد البيانات من خلال السماح بالاستعلام والفرز الفعال بناء على عدة حقول داخل المستندات. يقلل هذا التحسين من الحاجة إلى مسح المجموعات بأكملها، مما يسرع من استرجاع البيانات وتنظيمها.

ينشئ الأمر التالي فهرسا مركبا على الحقول author وبترتيب launchDate ترتيب معاكس.

use cosmicworks

db.products.createIndex({"author":1, "launchDate":-1})

Order الحقول تؤثر على الانتقائية أو استخدام المؤشر. find الاستفسار لن يستخدم الفهرس الذي تم إنشاؤه.

use cosmicworks

db.products.find({"launchDate": {$gt: ISODate("2024-06-01T00:00:00.000Z")}})

القيود

  • الحد الأقصى 32 حقلا/مسارا ضمن مؤشر مركب.

فهارس جزئية

الفهارس التي تحتوي على فلتر استعلام مرتبط يصف متى تولد مصطلح في الفهرس.

use cosmicworks

db.products.createIndex (
   { "author": 1, "launchDate": 1 },
   { partialFilterExpression: { "launchDate": { $gt: ISODate("2024-06-24T10:08:20.000Z") } } }
)

القيود

  • الفهارس الجزئية لا تدعم ORDER BY أو UNIQUE ما لم يكن المرشح مؤهلا.

فهارس النص

فهارس النصوص هي هياكل بيانات خاصة تقوم بتحسين الاستعلامات النصية، مما يجعلها أسرع وأكثر كفاءة.

استخدم الطريقة createIndex مع text خيار إنشاء فهرس نصي في title الحقل.

use cosmicworks;

db.products.createIndex({ title: "text" })

إشعار

بينما يمكنك تعريف فهرس نصي واحد فقط لكل مجموعة، يتيح Azure DocumentDB إنشاء فهارس نصية على مجموعة من عدة حقول لتمكينك من إجراء عمليات بحث نصية عبر حقول مختلفة في مستنداتك.

تكوين خيارات فهرس النص

تأتي الفهارس النصية في Azure DocumentDB مع عدة خيارات لتخصيص سلوكها. على سبيل المثال، يمكنك تحديد اللغة لتحليل النصوص، وتحديد الأوزان لإعطاء الأولوية لبعض الحقول، وتكوين عمليات البحث غير الحساسة للحرف. إليك مثال على إنشاء فهرس نصي مع خيارات:

  • أنشئ فهرسا لدعم البحث في كل من الحقول title والذين content يدعمون اللغة الإنجليزية. أيضا، خصص أوزانا أعلى للمجال title لترتيب أولوياته في نتائج البحث.

    use cosmicworks
    
    db.products.createIndex(
        { title: "text", content: "text" },
        { default_language: "english", weights: { title: 10, content: 5 }, caseSensitive: false }
    )
    

إشعار

عندما يقوم العميل بإجراء استعلام بحث نصي باستخدام مصطلح "DocumentDB"، يتم حساب الدرجة لكل مستند في المجموعة بناء على وجود وتكرار المصطلح في كل من حقلي "العنوان" و"المحتوى"، مع إعطاء أهمية أكبر لحقل "العنوان" بسبب وزنه الأعلى.

قم بإجراء بحث نصي باستخدام فهرس نصي

بمجرد إنشاء فهرس النص، يمكنك إجراء عمليات بحث نصية باستخدام عامل "text" في استفساراتك. يقوم مشغل النص بأخذ سلسلة بحث ومطابقتها مع فهرس النص للعثور على المستندات ذات الصلة.

  • قم بإجراء بحث نصي عن العبارة DocumentDB.

    use cosmicworks
    
    db.products.find(
      { $text: { $search: "DocumentDB" } }
    )
    
  • اختياريا، استخدم عامل $meta الإسقاط مع textScore الحقل في الاستعلام لرؤية الوزن

    use cosmicworks
    
    db.products.find(
    { $text: { $search: "DocumentDB" } },
    { score: { $meta: "textScore" } }
    )
    

القيود

  • يمكن تعريف فهرس نصي واحد فقط على مجموعة.
  • عمليات الفرز لا يمكنها استخدام ترتيب فهرس النص في MongoDB.
  • Hint() غير مدعوم مع استعلام يستخدم تعبير $text.
  • يمكن أن تكون فهارس النصوص كبيرة نسبيا، حيث تستهلك مساحة تخزين كبيرة مقارنة بأنواع الفهارس الأخرى.

مؤشرات الوايلد كارد

فهرسة على حقل واحد، يفهرس جميع المسارات تحت ، field مع استثناء الحقول الأخرى التي تقع على نفس المستوى. على سبيل المثال، في المستند النموذجي التالي

{
 "children":
    {
     "familyName": "Merriam",
     "pets": { "details": {“name”: "Goofy", ”age”: 3} }
   } 
}

إنشاء فهرس على { "pets.$**": 1 } ينشئ فهرسا على التفاصيل وخصائص المستندات الفرعية لكنه لا ينشئ فهرسا على "familyName".

القيود

  • لا يمكن لفهارس الوايلد كارد دعم الفهارس الفريدة.
  • فهارس البطاقات البرية لا تدعم الدفع للأسفل إلا ORDER BY إذا كان الفلتر يتضمن فقط المسارات الموجودة في البطاقة البرية (لأنها لا تفهرس عناصر غير معرفة)
  • يمكن أن يحتوي فهرس البطاقة الجامحة المركب فقط على one مصطلحات one وأخرى أو أكثر من مصطلحات الفهرس. { "pets.$**": 1, “familyName”: 1 }

الفهارس الجغرافية المكانية

تدعم الفهارس الجغرافية المكانية الاستعلامات على البيانات المخزنة ككائنات GeoJSON أو أزواج إحداثيات قديمة. يمكنك استخدام الفهارس الجغرافية لتحسين الأداء للاستعلامات على البيانات الجغرافية المكانية أو لتشغيل بعض الاستعلامات الجغرافية المكانية.

يوفر Azure DocumentDB نوعين من الفهارس الجغرافية المكانية:

  • فهارس 2dsphere، التي تدعم الاستعلامات التي تفسر الهندسة على الكرة.
  • فهارس ثنائية الأبعاد، التي تدعم الاستعلامات التي تفسر الهندسة على سطح مستو.

الفهارس ثنائية الأبعاد

تدعم الفهارس ثنائية الأبعاد فقط من خلال نمط زوج الإحداثيات القديم لتخزين البيانات الجغرافية المكانية.

استخدم الطريقة createIndex مع 2d خيار إنشاء مؤشر location جغرافي على الملعب.

db.places.createIndex({ "location": "2d"});

القيود

  • يمكن أن يكون حقل الموقع فقط one جزءا من 2d الفهرس، ولا يمكن compound 2d أن يكون جزءا من الفهرس إلا one الحقول غير الجغرافية الأخرىdb.places.createIndex({ "location": "2d", "non-geospatial-field": 1 / -1 })

مؤشرات 2dsphere

2dsphere تدعم الفهارس الاستعلامات الجغرافية المكانية على كرة شبيهة بالأرض. يمكنه دعم كائنات GeoJSON أو أزواج الإحداثيات القديمة. 2dSphere تعمل الفهارس مع أسلوب GeoJSON لتخزين البيانات، وإذا تم العثور على نقاط قديمة تحويلها إلى نقطة GeoJSON.

استخدم الطريقة createIndex مع 2dsphere خيار إنشاء مؤشر location جغرافي على الملعب.

db.places.createIndex({ "location": "2dsphere"});

2dsphere تسمح الفهارس بإنشاء فهارس على عدة حقول بيانات جغرافية مكانية ومتعددة غير مكانية. db.places.createIndex({ "location": "2d", "non-geospatial-field": 1 / -1, ... "more non-geospatial-field": 1 / -1 })

القيود

  • لا يدعم الفهرس المركب باستخدام فهرس عادي وجغرافي مكاني. إنشاء أي من الفهارس الجغرافية المكانية سيؤدي إلى أخطاء.

    // Compound Regular & 2dsphere indexes are not supported yet
    db.collection.createIndex({a: 1, b: "2dsphere"})
    
    // Compound 2d indexes are not supported yet
    db.collection.createIndex({a: "2d", b: 1})
    
  • المضلعات التي تحتوي على ثقوب لا تعمل. إدخال مضلع به ثقب غير مقيد رغم $geoWithin فشل الاستعلام في السيناريوهات:

    1. إذا كان الاستعلام نفسه يحتوي على مضلع به ثقوب

      coll.find(
        {
            "b": {
                "$geoWithin": {
                    "$geometry": {
                        "coordinates": [
                            [
                                [ 0, 0], [0, 10], [10, 10],[10,0],[0, 0]
                            ],
                            [
                                [5, 5], [8, 5], [ 8, 8], [ 5, 8], [ 5, 5]
                            ]
                        ],
                        "type": "Polygon"
                    }
                }
            }
        })
      
      // MongoServerError: $geoWithin currently doesn't support polygons with holes
      
    2. إذا كان هناك أي مستند غير مفلتر يحتوي على مضلع به ثقوب.

      [mongos] test> coll.find()
        [
          {
            _id: ObjectId("667bf7560b4f1a5a5d71effa"),
            b: {
              type: 'Polygon',
              coordinates: [
                [ [ 0, 0 ], [ 0, 10 ], [ 10, 10 ], [ 10, 0 ], [ 0, 0 ] ],
                [ [ 5, 5 ], [ 8, 5 ], [ 8, 8 ], [ 5, 8 ], [ 5, 5 ] ]
              ]
            }
          }
        ]
      // MongoServerError: $geoWithin currently doesn't support polygons with holes
      
    3. key الحقل إلزامي عند استخدام geoNear.

       [mongos] test> coll.aggregate([{ $geoNear: { $near: { "type": "Point", coordinates: [0, 0] } } }])
      
       // MongoServerError: $geoNear requires a 'key' option as a String
      

الخطوات التالية