• نبذة عن ميلفوس
  • ابدأ الآن
  • المفاهيم
  • دليل المستخدم
    • المجموعات
    • المخطط وحقول البيانات
    • إدراج وحذف
    • الفهارس
      • مؤشرات المتجهات العائمة
      • مؤشرات المتجهات الثنائية
      • فهارس المتجهات المتفرقة
      • الفهارس العددية
      • الفهارس الممكّنة لوحدة معالجة الرسومات
    • بحث
    • التضمين وإعادة التصنيف
    • تحسين التخزين
  • استيراد البيانات
  • أدوات الذكاء الاصطناعي
  • دليل الإدارة
  • الأدوات
  • عمليات الدمج
  • البرامج التعليمية
  • الأسئلة الشائعة
  • API Reference

NGRAM

تم بناء الفهرس NGRAM في ميلفوس لتسريع الاستعلامات LIKE على حقول VARCHAR أو مسارات JSON محددة داخل حقول JSON. قبل إنشاء الفهرس، يقسّم ميلفوس النص إلى سلاسل فرعية قصيرة ومتداخلة بطول ثابت والمعروفة باسم n-grams. على سبيل المثال، إذا كان n = 3، يتم تقسيم كلمة "Milvus" إلى 3 جرامات: "Mil" و "ilv" و "lvu" و "vus". ثم تُخزَّن هذه الجرامات النونية في فهرس مقلوب يعيّن كل جرام إلى معرّفات المستندات التي يظهر فيها. في وقت الاستعلام، يسمح هذا الفهرس لـ Milvus بتضييق نطاق البحث بسرعة إلى مجموعة صغيرة من المرشحين، مما يؤدي إلى تنفيذ الاستعلام بشكل أسرع بكثير.

استخدمه عندما تحتاج إلى تصفية سريعة للبادئة أو اللاحقة أو اللواحق أو اللواحق أو أحرف البدل مثل:

  • name LIKE "data%"

  • title LIKE "%vector%"

  • path LIKE "%json"

للحصول على تفاصيل حول بناء جملة تعبير التصفية، راجع المعاملات الأساسية.

كيف يعمل

يقوم ميلفوس بتنفيذ فهرس NGRAM في عملية من مرحلتين:

  1. بناء الفهرس: إنشاء ن-غرامات لكل مستند وبناء فهرس مقلوب أثناء الاستيعاب.

  2. تسريع الاستعلامات: استخدام الفهرس للتصفية إلى مجموعة مرشحة صغيرة، ثم التحقق من التطابق التام.

المرحلة 1: بناء الفهرس

أثناء استيعاب البيانات، يقوم ميلفوس ببناء فهرس NGRAM من خلال تنفيذ خطوتين رئيسيتين

  1. تحليل النص إلى ن-غرامات: يُمرر ميلفوس نافذة من n عبر كل سلسلة في الحقل المستهدف ويستخرج سلاسل فرعية متداخلة أو n-غرامات. يقع طول هذه السلاسل الفرعية ضمن نطاق قابل للتكوين، [min_gram, max_gram].

    • min_gram: أقصر n-غرام لتوليد. يحدد هذا أيضًا الحد الأدنى لطول السلسلة الفرعية للاستعلام التي يمكن أن تستفيد من الفهرس.

    • max_gram: أطول n-غرام لتوليدها. في وقت الاستعلام، يتم استخدامه أيضًا كحد أقصى لحجم النافذة عند تقسيم سلاسل الاستعلام الطويلة.

    على سبيل المثال، مع min_gram=2 و max_gram=3 ، يتم تقسيم السلسلة "AI database" على النحو التالي:

Build Ngram Index بناء فهرس نغرام

- **2-grams:** `AI`, `I_`, `_d`, `da`, `at`, ...

- **3-grams:** `AI_`, `I_d`, `_da`, `dat`, `ata`, ...

<div class="alert note">

- For a range `[min_gram, max_gram]`, Milvus generates all n-grams for every length between the two values (inclusive). For example, with `[2,4]` and the word `"text"`, Milvus generates:

- **2-grams:** `te`, `ex`, `xt`

- **3-grams:** `tex`, `ext`

- **4-grams:** `text`

- N-gram decomposition is character-based and language-agnostic. For example, in Chinese, `"向量数据库"` with `min_gram = 2` is decomposed into: `"向量"`, `"量数"`, `"数据"`, `"据库"`.

- Spaces and punctuation are treated as characters during decomposition.

- Decomposition preserves original case, and matching is case-sensitive. For example, `"Database"` and `"database"` will generate different n-grams and require exact case matching during queries.

</div>
  1. بناء فهرس مقلوب: يتم إنشاء فهرس مقلوب يقوم بتعيين كل n-gram تم إنشاؤه إلى قائمة بمعرفات المستندات التي تحتوي عليه.

    على سبيل المثال، إذا ظهر نغرام 2 "AI" في المستندات التي تحمل المعرفات 1 و5 و6 و8 و9، فإن الفهرس يسجل {"AI": [1, 5, 6, 8, 9]}. ثم يُستخدم هذا الفهرس في وقت الاستعلام لتضييق نطاق البحث بسرعة.

Build Ngram Index 2 بناء فهرس نغرام 2

<div class="alert note">

A wider `[min_gram, max_gram]` range creates more grams and larger mapping lists. If memory is tight, consider mmap mode for very large posting lists. For details, refer to [Use mmap](https://zilliverse.feishu.cn/wiki/P3wrwSMNNihy8Vkf9p6cTsWYnTb).

</div>

المرحلة 2: تسريع الاستعلامات

عندما يتم تنفيذ مرشح LIKE ، يستخدم ميلفوس فهرس NGRAM لتسريع الاستعلام في الخطوات التالية:

Accelerate Queries تسريع الاستعلامات

  1. استخراج مصطلح الاستعلام: يتم استخراج السلسلة الفرعية المتجاورة بدون أحرف البدل من التعبير LIKE (على سبيل المثال، "%database%" يصبح "database").

  2. تفكيك مصطلح الاستعلام: يتحلل مصطلح الاستعلام إلى n-غرامات بناءً على طوله (L) والإعدادات min_gram و max_gram.

    • إذا كان L < min_gram ، لا يمكن استخدام الفهرس، ويعود الاستعلام إلى المسح الكامل.

    • إذا كان min_gram ≤ L ≤ max_gram ، يتم التعامل مع مصطلح الاستعلام بأكمله على أنه n-gram واحد، ولا يلزم إجراء مزيد من التحلل.

    • إذا كان L > max_gram ، يتم تقسيم مصطلح الاستعلام إلى غرامات متداخلة باستخدام حجم نافذة يساوي max_gram.

    على سبيل المثال، إذا تم تعيين max_gram إلى 3 وكان مصطلح الاستعلام هو "database" ، والذي يبلغ طوله يتم تفكيكه إلى 3 سلاسل جرامات فرعية مثل "dat" و "ata" و "tab" وهكذا.

  3. البحث عن كل غرام وتقاطعه: يبحث Milvus عن كل غرام من غرامات الاستعلام في الفهرس المقلوب ثم يتقاطع مع قوائم معرفات المستندات الناتجة للعثور على مجموعة صغيرة من المستندات المرشحة. تحتوي هذه المستندات المرشحة على جميع الجرامات من الاستعلام.

  4. التحقق من النتائج وإرجاعها: ثم يتم تطبيق مرشح LIKE الأصلي كتحقق نهائي على المجموعة الصغيرة المرشحة فقط للعثور على التطابقات التامة.

إنشاء فهرس NGRAM

يمكنك إنشاء فهرس NGRAM على حقل VARCHAR أو على مسار محدد داخل حقل JSON.

مثال 1: إنشاء على حقل VARCHAR

بالنسبة لحقل VARCHAR ، يمكنك ببساطة تحديد field_name وتكوين min_gram و max_gram.

from pymilvus import MilvusClient

client = MilvusClient(uri="http://localhost:19530") # Replace with your server address

# Assume you have defined a VARCHAR field named "text" in your collection schema

# Prepare index parameters
index_params = client.prepare_index_params()

# Add NGRAM index on the "text" field
index_params.add_index(
    field_name="text",   # Target VARCHAR field
    index_type="NGRAM",           # Index type is NGRAM
    index_name="ngram_index",     # Custom name for the index
    min_gram=2,                   # Minimum substring length (e.g., 2-gram: "st")
    max_gram=3                    # Maximum substring length (e.g., 3-gram: "sta")
)

# Create the index on the collection
client.create_index(
    collection_name="Documents",
    index_params=index_params
)

يقوم هذا التكوين بإنشاء 2 و3 جرامات لكل سلسلة في text وتخزينها في الفهرس المقلوب.

مثال 2: إنشاء على مسار JSON

بالنسبة لحقل JSON ، بالإضافة إلى إعدادات الجرام، يجب أيضًا تحديد

  • params.json_path - مسار JSON الذي يشير إلى القيمة التي تريد فهرستها.

  • params.json_cast_type - يجب أن يكون "varchar" (غير حساس لحالة الأحرف)، لأن فهرسة NGRAM تعمل على السلاسل.

# Assume you have defined a JSON field named "json_field" in your collection schema, with a JSON path named "body"

# Prepare index parameters
index_params = client.prepare_index_params()

# Add NGRAM index on a JSON field
index_params.add_index(
    field_name="json_field",              # Target JSON field
    index_type="NGRAM",                   # Index type is NGRAM
    index_name="json_ngram_index",        # Custom index name
    min_gram=2,                           # Minimum n-gram length
    max_gram=4,                           # Maximum n-gram length
    params={
        "json_path": "json_field[\"body\"]",  # Path to the value inside the JSON field
        "json_cast_type": "varchar"                  # Required: cast the value to varchar
    }
)

# Create the index on the collection
client.create_index(
    collection_name="Documents",
    index_params=index_params
)

في هذا المثال

  • تتم فهرسة القيمة الموجودة في json_field["body"] فقط.

  • يتم تحويل القيمة إلى VARCHAR قبل ترميز n-gram.

  • يُنشئ ميلفوس سلاسل فرعية بطول 2 إلى 4 ويخزنها في الفهرس المقلوب.

لمزيد من المعلومات حول كيفية فهرسة حقل JSON، راجع فهرسة JSON.

تسريع الاستعلامات بواسطة NGRAM

لكي يتم تطبيق فهرس NGRAM:

  • يجب أن يستهدف الاستعلام حقلاً VARCHAR (أو مسار JSON) يحتوي على فهرس NGRAM.

  • يجب ألا يقل طول الجزء الحرفي من النمط LIKE عن min_gram حرفًا.(على سبيل المثال، إذا كان أقصر حد متوقع للاستعلام هو حرفان، قم بتعيين min_gram=2 عند إنشاء الفهرس).

أنواع الاستعلامات المدعومة:

  • مطابقة البادئة

    # Match any string that starts with the substring "database"
    filter = 'text LIKE "database%"'
    
  • مطابقة لاحقة

    # Match any string that ends with the substring "database"
    filter = 'text LIKE "%database"'
    
  • مطابقة لاحقة

    # Match any string that contains the substring "database" anywhere
    filter = 'text LIKE "%database%"'
    
  • مطابقة أحرف البدل

    يدعم Milvus كلاً من % (صفر أو أكثر من الأحرف) و _ (حرف واحد فقط).

    # Match any string where "st" appears first, and "um" appears later in the text 
    filter = 'text LIKE "%st%um%"'
    
  • استعلامات مسار JSON

    filter = 'json_field["body"] LIKE "%database%"'
    

لمزيد من المعلومات حول بناء جملة تعبيرات التصفية، راجع المعاملات الأساسية.

إسقاط فهرس

استخدم الأسلوب drop_index() لإزالة فهرس موجود من مجموعة.

client.drop_index(
    collection_name="Documents",   # Name of the collection
    index_name="ngram_index" # Name of the index to drop
)

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

  • أنواع الحقول: مدعومة على حقول VARCHAR و JSON. بالنسبة إلى JSON، قدم كلاً من params.json_path و params.json_cast_type="varchar".

  • يونيكود: يعتمد تحليل NGRAM على الأحرف ولا يعتمد على اللغة ويتضمن المسافات البيضاء وعلامات الترقيم.

  • المفاضلة بين المساحة والوقت: نطاقات غرامات أوسع [min_gram, max_gram] تنتج غرامات أكثر وفهارس أكبر. إذا كانت الذاكرة ضيقة، فكر في وضع mmap لقوائم الترحيل الكبيرة. لمزيد من المعلومات، راجع استخدام mmap.

  • الثبات: لا يمكن تغيير min_gram و max_gram في المكان - قم بإعادة بناء الفهرس لتعديلها.

أفضل الممارسات

  • اختر min_gram و max_gram لمطابقة سلوك البحث

    • ابدأ بـ min_gram=2 ، max_gram=3

    • اضبط min_gram على أقصر حرف تتوقع أن يكتبه المستخدمون.

    • قم بتعيين max_gram بالقرب من الطول النموذجي للسلاسل الفرعية ذات المعنى؛ الأكبر max_gram يحسن التصفية ولكنه يزيد من المساحة.

  • تجنّب الجرامات ذات الانتقائية المنخفضة

    توفر الأنماط شديدة التكرار (على سبيل المثال، "aaaaaa") تصفية ضعيفة وقد تحقق مكاسب محدودة.

  • التطبيع بشكل متسق

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