مطابقة الأنماط

في تطبيقات البحث التفاعلي، غالبًا ما يكمل كل من البحث المتجه ومطابقة الأنماط على غرار grep بعضهما البعض. يسترد البحث المتجه الكيانات ذات الصلة من الناحية الدلالية، بينما تضيق مطابقة الأنماط نطاق تلك النتائج بناءً على هياكل سلاسل نصية محددة، مثل رموز الأخطاء، أو بادئات السجلات، أو نطاقات البريد الإلكتروني، أو مسارات عناوين URL، أو المعرفات.

في Milvus، يمكنك التعبير عن قيود الأنماط هذه في المرشحات القياسية باستخدام LIKE لمطابقة أحرف البدل البسيطة، و =~ أو !~ للتعبيرات العادية RE2. يمكنك دمج هذه المرشحات مع query أو search أو البحث الهجين.

تصف هذه الصفحة مطابقة الأنماط في تعبيرات المرشحات القياسية المستخدمة بواسطة query و search والبحث المختلط. تقوم هذه التعبيرات بتقييم قيم الحقول ولا تغير الرموز التي ينتجها المحلل. لتصفية الرموز أثناء تحليل النص، راجع مرشح محلل التعبيرات النمطية.

تُكتب تعبيرات مطابقة الأنماط في المعلمة filter. على سبيل المثال، يطابق الاستعلام التالي رسائل السجل التي تحتوي على رمز خطأ مثل E1001:

from pymilvus import MilvusClient

client = MilvusClient(uri="http://localhost:19530")

res = client.query(
    collection_name="log_events",
    filter='message =~ "E[0-9]{4}"',
    output_fields=["message", "severity"],
)

تركز الأمثلة الواردة في هذه الصفحة على التعبير المخصص لـ filter. يمكنك استخدام نفس صيغة تعبير التصفية في عمليات Milvus التي تقبل مرشحًا قياسيًا، مثل query و search والبحث الهجين.

أنواع الحقول المدعومة

تتوفر مطابقة الأنماط للقيم النصية.

الهدفLIKERegex =~ / !~ملاحظات
VARCHAR الحقلنعمنعمالهدف النموذجي لمطابقة الأنماط في حقول السلسلة.
JSON مسار مع نوع تحويل VARCHAR نعمنعميجب أن تكون قيمة مسار JSON سلسلة نصية للحصول على مطابقات إيجابية. إذا قمت بإنشاء فهرس على مسار JSON من أجل التسريع، فقم بتعيين json_cast_type="varchar".
ARRAY<VARCHAR> العنصرنعمنعممطابقة عنصر معين حسب الفهرس، مثل tags[0]. لا تقوم مطابقة الأنماط بمسح جميع العناصر؛ بل تنطبق فقط على العنصر الموجود في الفهرس المحدد.
أهداف رقمية أو منطقية أو متجهة أو TEXT أو أهداف أخرى غيرVARCHAR لالامطابقة الأنماط متاحة فقط لقيم VARCHAR ، أو مسارات JSON التي تُحل إلى سلاسل، أو عناصر ARRAY<VARCHAR> المفهرسة.

اختر LIKE أو regex

اختر أبسط عامل يعبر عن النمط الذي تحتاجه.

إذا كنت بحاجة إلى مطابقة سلسلة نصية دقيقة، نوصيك باستخدام == بدلاً من مطابقة الأنماط. استخدم LIKE أو regex فقط عندما يحتاج المرشح إلى مطابقة نمط ما.

المتطلباتالمشغل الموصى بهمثالالوصف
المطابقة التامة للسلسلة==status == "active"التطابق التام للسلسلة active.
المطابقة البسيطة للبادئةLIKEname LIKE "Prod%"تطابق السلاسل التي تبدأ بـ Prod.
المطابقة البسيطة لللاحقةLIKEfilename LIKE "%.json"تطابق السلاسل التي تنتهي بـ .json.
مطابقة بسيطة لـ "يحتوي على"LIKEdescription LIKE "%vector database%"تطابق القيم التي تحتوي على vector database في أي مكان في السلسلة.
مطابقة رمز منظم أو نمط ذي طول ثابت=~code =~ "E[0-9]{4}"تطابق السلاسل التي تحتوي، مع مراعاة الأحرف الكبيرة والصغيرة، على E متبوعًا بأربعة أرقام، مثل E1001.
مطابقة الأنماط دون التمييز بين الأحرف الكبيرة والصغيرة=~ مع (?i)message =~ "(?i)error"تطابق error أو ERROR أو أي صيغ أخرى بأحرف كبيرة وصغيرة.
استبعاد القيم التي تتطابق مع نمط تعبير عادي!~message !~ "^DEBUG"يستبعد السلاسل التي تبدأ بـ DEBUG.

استخدم LIKE لمطابقة بسيطة باستخدام أحرف البدل. استخدم regex عندما يحتاج النمط إلى فئات الأحرف، أو التكرار، أو التناوب مثل error|failed ، أو نقاط الربط، أو المطابقة غير الحساسة لحالة الأحرف.

استخدم LIKE

يُستخدم عامل LIKE للمطابقة البسيطة باستخدام أحرف البدل على قيم السلاسل. وهو يدعم أحرف البدل التالية فقط:

حرف البدلالوصف
%يطابق صفرًا أو أكثر من الأحرف.
_تطابق حرفًا واحدًا بالضبط.

أنماط LIKE الشائعة

استخدم موضع % و _ للتحكم في مكان ظهور النص الثابت في السلسلة المتطابقة.

المتطلباتالنمطمثال على التصفية
يبدأ ببادئةProd%filter = 'name LIKE "Prod%"'
ينتهي بلاحقة%.jsonfilter = 'filename LIKE "%.json"'
يحتوي على سلسلة فرعية%vector%filter = 'description LIKE "%vector%"'
يتطابق مع حرف واحد في موضع ثابتAB_%filter = 'code LIKE "AB_%"'

سلوك المطابقة LIKE

استخدم LIKE لمطابقات البادئة واللاحقة والمحتوى والحرف الواحد في موضع ثابت. لا يدعم LIKE فئات الأحرف مثل [0-9] ، أو التناوب مثل error|failed ، أو عدد التكرارات مثل {4} ، أو المراسي مثل ^ أو $ ، أو علامات عدم التمييز بين الأحرف الكبيرة والصغيرة مثل (?i). استخدم regex لهذه الأنماط.

استخدم == لمطابقة السلسلة الكاملة بالضبط. استخدم LIKE فقط عندما يحتاج المرشح إلى مطابقة أحرف البدل.

تهرب أحرف البدل في نمط LIKE

في أنماط LIKE ، تتطابق % مع صفر أو أكثر من الأحرف، بينما تتطابق _ مع حرف واحد بالضبط. لمطابقة % أو _ أو \ حرفيًا، قم بتفادي الحرف باستخدام شرطة مائلة عكسية (\):

  • name LIKE r"\%" تطابق القيمة الحرفية %.
  • name LIKE r"\_%" تتطابق مع القيم التي تبدأ بالرمز الحرفي _.
  • name LIKE r"\\%" تتطابق مع القيم التي تبدأ بعلامة مائلة عكسية حرفية.

تحتفظ القيم الحرفية للسلسلة الخام، المكتوبة على النحو r"..." أو r'...' ، بالشرطات المائلة العكسية حرفياً في تعبيرات مرشح Milvus. ويوصى باستخدامها في LIKE وأنماط التعبيرات النمطية التي تحتوي على شرطات مائلة عكسية. وبدون سلسلة خام، لا تزال القيم الحرفية العادية للسلسلة تعالج تسلسلات الهروب قبل تقييم النمط، لذا قد يتطلب الأمر المزيد من الشرطات المائلة العكسية.

استخدم التعبيرات النمطيةCompatible with Milvus 3.0.x

استخدم مرشحات التعبيرات النمطية (regex) عندما يتطلب النمط ميزات التعبيرات النمطية مثل فئات الأحرف، والتكرار، والتناوب، والمراسي، أو المطابقة غير الحساسة لحالة الأحرف. يطبق Milvus تعبيرًا نمطيًا من نوع RE2 على قيمة السلسلة.

يجب أن يكون الجانب الأيمن من =~ أو !~ عبارة نصية.

المُشغِّلالمعنىمثال
=~يطابق القيم التي تستوفي نمط التعبير العادي.filter = 'message =~ "E[0-9]{4}"'
!~يستبعد القيم التي تتوافق مع نمط التعبير العادي.filter = 'message !~ "^DEBUG"'

استخدم القيم الثابتة للسلسلة الخام

يُنصح باستخدام سلاسل نصية خام لأنماط التعبيرات النمطية التي تحتوي على خطوط مائلة عكسية. في السلسلة النصية الخام، المكتوبة على النحو التالي: r"..." أو r'...' ، يتم تمرير الخطوط المائلة العكسية إلى محرك التعبيرات النمطية حرفياً. وهذا يتجنب الهروب الإضافي المطلوب في السلاسل النصية العادية.

على سبيل المثال:

filter = 'message =~ r"\d{4}-\d{2}-\d{2}"'

يتطابق هذا مع السلاسل التي تحتوي على قيمة تشبه التاريخ مثل 2026-07-01.

بدون سلسلة نصية خام، تقوم السلاسل النصية العادية بمعالجة تسلسلات الهروب قبل تقييم نمط التعبير النمطي، لذا قد تتطلب أنماط مثل \d أو \s أو الأحرف النصية التي تم الهروب منها علامات مائلة عكسية إضافية.

أنماط التعبيرات النمطية الشائعة

تستخدم الأمثلة التالية صيغة RE2 الشائعة في تعبيرات تصفية Milvus. للاطلاع على صيغة التعبيرات النمطية الكاملة، راجع مرجع صيغة RE2.

المتطلباتالنمطمثال على التصفية
يحتوي على نص حرفيerrorfilter = 'message =~ "error"'
يبدأ ببادئة^ERRfilter = 'code =~ "^ERR"'
ينتهي بلاحقة\.json$filter = 'filename =~ "\\.json$"'
يتطابق مع تسلسل أرقام[0-9]+filter = 'message =~ "[0-9]+"'
يتطابق مع عدد ثابت من الأرقام[0-9]{4}filter = 'code =~ "[0-9]{4}"'
يتطابق مع نطاق بريد إلكتروني@example\.com$filter = 'email =~ "@example\\.com$"'
تطابق دون التمييز بين الأحرف الكبيرة والصغيرة(?i)errorfilter = 'message =~ "(?i)error"'
تطابق السلسلة الكاملة^prod-[0-9]+$filter = 'name =~ "^prod-[0-9]+$"'

لمطابقة إحدى الكلمات المتعددة، استخدم البدائل باستخدام |:

filter = 'message =~ "error|failed|timeout"'

عند مطابقة أحرف خاصة في التعبير النمطي حرفيًا، قم بتحويلها في نمط التعبير النمطي. على سبيل المثال، لمطابقة نقطة حرفية (\. في التعبير النمطي)، اكتب \\. في سلسلة مرشح Python:

filter = 'email =~ "@gmail\\.com$"'

ملاحظة: تتبع مرشحات التعبيرات النمطية في Milvus صيغة RE2. إذا استخدم نمط التعبير النمطي صيغة لا تدعمها RE2 أو كانت غير صالحة لأي سبب آخر، فإن Milvus يرفض تعبير المرشح. للحصول على تفاصيل حول أحرف التعبيرات النمطية الخاصة والعلامات وسلوك المطابقة، راجع مرجع صيغة RE2.

سلوك المطابقة

مطابقة الأجزاء الفرعية

تستخدم مطابقة التعبيرات النمطية في Milvus دلالات السلسلة الفرعية. لا يلزم أن يتطابق النمط مع قيمة الحقل بالكامل. على سبيل المثال، يتطابق المرشح التالي مع كل من E1001 و failed with E1001 after retry:

filter = 'message =~ "E[0-9]{4}"'

لمطابقة قيمة الحقل بالكامل، استخدم نقاط الربط ^ و $:

# Match only values that are exactly E followed by four digits
filter = 'code =~ "^E[0-9]{4}$"'

حقول VARCHAR القابلة للقيمة الفارغة

لا تتطابق عوامل تصفية Regex مع القيم الفارغة. وينطبق هذا على كل من =~ و !~. إذا كنت ترغب في استبعاد نمط Regex مع الاحتفاظ بالقيم الفارغة، فقم بإضافة OR field IS NULL بشكل صريح:

filter = 'message !~ "^DEBUG" OR message IS NULL'

مسارات JSON

بالنسبة لمسارات JSON، تتصرف مرشحات التعبيرات النمطية بشكل مختلف عندما يكون المسار مفقودًا أو فارغًا أو يُحل إلى قيمة غير سلسلة:

المرشحهل يشمل القيم المفقودة/الصفرية/غير السلسلة؟ملاحظات
json_field["path"] =~ "pattern"لايتطابق فقط مع القيم النصية التي تستوفي نمط التعبير العادي.
json_field["path"] !~ "pattern"نعمتُرجع الكيانات التي يكون المسار فيها مفقودًا أو فارغًا أو غير نصي أو عبارة عن سلسلة لا تتطابق مع نمط التعبير العادي.

تسريع مطابقة الأنماط باستخدام الفهارس

يدعم Milvus عدة أنواع من الفهارس في حقول السلاسل التي يمكن استخدامها مع " LIKE " وفلاتر التعبيرات العادية في حقول " VARCHAR " أو مسارات سلاسل JSON، مثل NGRAM و STL_SORT و INVERTED و BITMAP. يمكن أن تعمل مطابقة الأنماط بدون فهرس، لكن الفهرس يمكن أن يحسن الأداء في مجموعات البيانات الكبيرة.

تعتمد فعالية الفهرس على تعبير النمط، وما إذا كان بإمكان Milvus استخراج سلاسل فرعية حرفية ثابتة، بالإضافة إلى عدد عناصر الحقل المستهدف وتوزيعها. قد تستفيد الأنماط ذات البادئة، مثل name LIKE "Prod%" ، من استراتيجيات فهرسة مختلفة عن الأنماط ذات الوسيطة أو اللاحقة، مثل description LIKE "%vector%" أو filename LIKE "%.json".

استخدم الجدول التالي كنقطة انطلاق، ثم قم بإجراء مقارنة مع حمل العمل الخاص بك:

النمط أو خاصية البياناتالفهرس الذي يجب أخذه في الاعتبارملاحظات
يحتوي على سلاسل فرعية حرفية ثابتة، مثل message =~ "error.*timeout" أو message LIKE "%database%"NGRAMيكون ذلك مفيدًا عندما يتمكن Milvus من استخراج سلاسل فرعية حرفية ذات معنى من النمط. لمزيد من التفاصيل، راجع NGRAM.
مرشحات السلاسل البادئة أو الدقيقة أو الشبيهة بالمساواة، خاصةً في الحقول ذات الكثافة المنخفضة إلى المتوسطةSTL_SORT، أو INVERTED ، أو BITMAPقد تكون أكثر فعالية عندما يحتوي الحقل على قيم متكررة أو عندما يكون المرشح قريبًا من المطابقة الدقيقة. لمزيد من التفاصيل، راجع STL_SORT و INVERTED و BITMAP.
أنماط Regex التي لا تحتوي على قيم حرفية ثابتة، أو الأنماط التي تهيمن عليها فئات الأحرف، أو الرموز القصيرة، أو أحرف البدلقم بإجراء اختبار الأداء قبل الاعتماد على تسريع الفهرسقد توفر هذه الأنماط انتقائية محدودة للفهرس ويمكن أن تلجأ إلى عمليات مسح أوسع نطاقًا.