NGRAM
تم بناء الفهرس NGRAM في ميلفوس لتسريع الاستعلامات LIKE على حقول VARCHAR أو مسارات JSON محددة داخل حقول JSON. قبل إنشاء الفهرس، يقسّم ميلفوس النص إلى سلاسل فرعية قصيرة ومتداخلة بطول ثابت n، والمعروفة باسم n-grams. على سبيل المثال، إذا كان n = 3، يتم تقسيم كلمة "Milvus" إلى 3 جرامات: "Mil" و "ilv" و "lvu" و "vus". ثم تُخزَّن هذه الجرامات النونية في فهرس مقلوب يعيّن كل جرام إلى معرّفات المستندات التي يظهر فيها. في وقت الاستعلام، يسمح هذا الفهرس لـ Milvus بتضييق نطاق البحث بسرعة إلى مجموعة صغيرة من المرشحين، مما يؤدي إلى تنفيذ الاستعلام بشكل أسرع بكثير.
استخدمه عندما تحتاج إلى تصفية سريعة للبادئة أو اللاحقة أو اللواحق أو اللواحق أو أحرف البدل مثل:
name LIKE "data%"title LIKE "%vector%"path LIKE "%json"
للحصول على تفاصيل حول بناء جملة تعبير التصفية، راجع المعاملات الأساسية.
كيف يعمل
يقوم ميلفوس بتنفيذ فهرس NGRAM في عملية من مرحلتين:
بناء الفهرس: إنشاء ن-غرامات لكل مستند وبناء فهرس مقلوب أثناء الاستيعاب.
تسريع الاستعلامات: استخدام الفهرس للتصفية إلى مجموعة مرشحة صغيرة، ثم التحقق من التطابق التام.
المرحلة 1: بناء الفهرس
أثناء استيعاب البيانات، يقوم ميلفوس ببناء فهرس NGRAM من خلال تنفيذ خطوتين رئيسيتين
تحليل النص إلى ن-غرامات: يُمرر ميلفوس نافذة من n عبر كل سلسلة في الحقل المستهدف ويستخرج سلاسل فرعية متداخلة أو n-غرامات. يقع طول هذه السلاسل الفرعية ضمن نطاق قابل للتكوين،
[min_gram, max_gram].min_gram: أقصر n-غرام لتوليد. يحدد هذا أيضًا الحد الأدنى لطول السلسلة الفرعية للاستعلام التي يمكن أن تستفيد من الفهرس.max_gram: أطول n-غرام لتوليدها. في وقت الاستعلام، يتم استخدامه أيضًا كحد أقصى لحجم النافذة عند تقسيم سلاسل الاستعلام الطويلة.
على سبيل المثال، مع
min_gram=2وmax_gram=3، يتم تقسيم السلسلة"AI database"على النحو التالي:
بناء فهرس نغرام
- **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>
بناء فهرس مقلوب: يتم إنشاء فهرس مقلوب يقوم بتعيين كل n-gram تم إنشاؤه إلى قائمة بمعرفات المستندات التي تحتوي عليه.
على سبيل المثال، إذا ظهر نغرام 2
"AI"في المستندات التي تحمل المعرفات 1 و5 و6 و8 و9، فإن الفهرس يسجل{"AI": [1, 5, 6, 8, 9]}. ثم يُستخدم هذا الفهرس في وقت الاستعلام لتضييق نطاق البحث بسرعة.
بناء فهرس نغرام 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 لتسريع الاستعلام في الخطوات التالية:
تسريع الاستعلامات
استخراج مصطلح الاستعلام: يتم استخراج السلسلة الفرعية المتجاورة بدون أحرف البدل من التعبير
LIKE(على سبيل المثال،"%database%"يصبح"database").تفكيك مصطلح الاستعلام: يتحلل مصطلح الاستعلام إلى 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"، والذي يبلغ طوله 8، يتم تفكيكه إلى 3 سلاسل جرامات فرعية مثل"dat"و"ata"و"tab"وهكذا.البحث عن كل غرام وتقاطعه: يبحث Milvus عن كل غرام من غرامات الاستعلام في الفهرس المقلوب ثم يتقاطع مع قوائم معرفات المستندات الناتجة للعثور على مجموعة صغيرة من المستندات المرشحة. تحتوي هذه المستندات المرشحة على جميع الجرامات من الاستعلام.
التحقق من النتائج وإرجاعها: ثم يتم تطبيق مرشح
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") تصفية ضعيفة وقد تحقق مكاسب محدودة.التطبيع بشكل متسق
قم بتطبيق نفس التطبيع على النص المستوعب والنصوص الحرفية للاستعلام (على سبيل المثال، تصغير الأحرف، والتشذيب) إذا كانت حالة الاستخدام الخاصة بك تحتاج إلى ذلك.