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

في تطبيقات البحث التفاعلي، غالبًا ما يكمل كل من البحث المتجه ومطابقة الأنماط على غرار 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"],
)
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.service.vector.request.QueryReq;
import io.milvus.v2.service.vector.response.QueryResp;
import java.util.Arrays;

MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()
        .uri("http://localhost:19530")
        .build());

QueryResp res = client.query(QueryReq.builder()
        .collectionName("log_events")
        .filter("message =~ \"E[0-9]{4}\"")
        .outputFields(Arrays.asList("message", "severity"))
        .build());
import (
    "context"
    "fmt"

    "github.com/milvus-io/milvus/client/v2/milvusclient"
)

ctx := context.Background()
client, err := milvusclient.New(ctx, &milvusclient.ClientConfig{
    Address: "localhost:19530",
})
if err != nil {
    // handle error
}
defer client.Close(ctx)

res, err := client.Query(ctx, milvusclient.NewQueryOption("log_events").
    WithFilter(`message =~ "E[0-9]{4}"`).
    WithOutputFields("message", "severity"))
if err != nil {
    // handle error
}
fmt.Println(res)
const { MilvusClient } = require('@zilliz/milvus2-sdk-node');

async function main() {
  const client = new MilvusClient({ address: 'http://localhost:19530' });

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

main().catch((error) => {
  console.error(error);
  process.exitCode = 1;
});
export CLUSTER_ENDPOINT="http://localhost:19530"
export TOKEN="root:Milvus"

curl --request POST \
  --url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \
  --header "Authorization: Bearer ${TOKEN}" \
  --header "Content-Type: application/json" \
  --data '{
    "collectionName": "log_events",
    "filter": "message =~ \"E[0-9]{4}\"",
    "outputFields": ["message", "severity"]
  }'
#include "milvus/MilvusClientV2.h"
#include <iostream>

auto client = milvus::MilvusClientV2::Create();

milvus::ConnectParam connect_param{"http://localhost:19530", "root:Milvus"};
auto status = client->Connect(connect_param);
if (!status.IsOk()) {
    std::cout << status.Message() << std::endl;
}

auto request = milvus::QueryRequest()
                   .WithCollectionName("log_events")
                   .WithFilter(R"(message =~ "E[0-9]{4}")")
                   .AddOutputField("message")
                   .AddOutputField("severity");

milvus::QueryResponse response;
status = client->Query(request, response);
if (!status.IsOk()) {
    std::cout << status.Message() << std::endl;
}

تركز الأمثلة الواردة في هذه الصفحة على التعبير المخصص لـ 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 = r'filename =~ r"\.json$"'
String filter = "filename =~ r\"\\.json$\"";
filter := `filename =~ r"\.json$"`
const filter = 'filename =~ r"\\.json$"';
filter='filename =~ r"\.json$"'
std::string filter = R"(filename =~ r"\.json$")";

يتطابق هذا مع السلاسل التي تنتهي بـ .json ، مثل report.json.

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

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

تستخدم الأمثلة التالية صيغة 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"'
String filter = "message =~ \"error|failed|timeout\"";
filter := `message =~ "error|failed|timeout"`
const filter = 'message =~ "error|failed|timeout"';
filter='message =~ "error|failed|timeout"'
std::string filter = R"(message =~ "error|failed|timeout")";

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

filter = 'email =~ "@gmail\\.com$"'
String filter = "email =~ \"@gmail\\.com$\"";
filter := `email =~ "@gmail\\.com$"`
const filter = 'email =~ "@gmail\\.com$"';
filter='email =~ "@gmail\\.com$"'
std::string filter = R"(email =~ "@gmail\\.com$")";

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

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

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

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

filter = 'message =~ "E[0-9]{4}"'
String filter = "message =~ \"E[0-9]{4}\"";
filter := `message =~ "E[0-9]{4}"`
const filter = 'message =~ "E[0-9]{4}"';
filter='message =~ "E[0-9]{4}"'
std::string filter = R"(message =~ "E[0-9]{4}")";

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

# Match only values that are exactly E followed by four digits
filter = 'code =~ "^E[0-9]{4}$"'
// Match only values that are exactly E followed by four digits
String filter = "code =~ \"^E[0-9]{4}$\"";
// Match only values that are exactly E followed by four digits
filter := `code =~ "^E[0-9]{4}$"`
// Match only values that are exactly E followed by four digits
const filter = 'code =~ "^E[0-9]{4}$"';
# Match only values that are exactly E followed by four digits
filter='code =~ "^E[0-9]{4}$"'
std::string filter = R"(code =~ "^E[0-9]{4}$")";

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

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

filter = 'message !~ "^DEBUG" OR message IS NULL'
String filter = "message !~ \"^DEBUG\" OR message IS NULL";
filter := `message !~ "^DEBUG" OR message IS NULL`
const filter = 'message !~ "^DEBUG" OR message IS NULL';
filter='message !~ "^DEBUG" OR message IS NULL'
std::string filter = R"(message !~ "^DEBUG" OR message IS NULL)";

مسارات JSON

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

المرشحهل يشمل القيم المفقودة/القيم الفارغة/القيم غير النصية؟ملاحظات
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 التي لا تحتوي على أحرف ثابتة، أو الأنماط التي تهيمن عليها فئات الأحرف، أو الرموز القصيرة، أو أحرف البدلقم بإجراء اختبار الأداء قبل الاعتماد على تسريع الفهرسقد توفر هذه الأنماط انتقائية محدودة للفهرس ويمكن أن تلجأ إلى عمليات مسح أوسع نطاقًا.