Milvus
Zilliz
الصفحة الرئيسية
  • دليل المستخدم
  • Home
  • Docs
  • دليل المستخدم

  • بحث

  • أداة تمييز النص

أداة تمييز النصCompatible with Milvus 2.6.8+

تقوم أداة تمييز النص في Milvus بوضع تعليقات توضيحية للمصطلحات المتطابقة في الحقول النصية عن طريق تغليفها بعلامات قابلة للتخصيص. يساعد التظليل على توضيح سبب تطابق المستند، ويحسن من سهولة قراءة النتائج، ويدعم العرض الغني في تطبيقات البحث و RAG.

يتم تنفيذ التظليل كخطوة معالجة لاحقة على مجموعة نتائج البحث النهائية. وهو لا يؤثر على استرجاع المرشح أو منطق التصفية أو الترتيب أو التسجيل.

توفر أداة التمييز ثلاثة أبعاد مستقلة للتحكم:

  • المصطلحات التي يتم تمييزها

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

  • كيفية عرض المصطلحات المميزة

    يمكنك التحكم في كيفية ظهور المصطلحات المتطابقة في مخرجات التظليل من خلال تكوين العلامات المدرجة قبل وبعد كل تطابق. على سبيل المثال، استخدم علامات بسيطة مثل {} أو علامات HTML مثل <em></em> للعرض الغني.

  • كيفية إرجاع النص المميز

    يمكنك التحكم في كيفية إرجاع النتائج المميزة كأجزاء، بما في ذلك مكان بدء الأجزاء وطولها وعدد الأجزاء التي يتم إرجاعها.

تستعرض الأقسام التالية هذه السيناريوهات.

عند إجراء بحث في النص الكامل في BM25، يمكنك تمييز مصطلحات البحث في النتيجة التي تم إرجاعها للمساعدة في توضيح سبب تطابق المستند مع الاستعلام. لمعرفة المزيد حول البحث بالنص الكامل في BM25، راجع البحث بالنص الكامل.

في هذا السيناريو، تأتي المصطلحات المميزة مباشرةً من مصطلحات البحث المستخدمة في البحث عن النص الكامل BM25. يستخدم أداة التمييز هذه المصطلحات للتعليق على النص المطابق في النتيجة النهائية.

افترض أن المحتوى التالي مخزن في حقل نصي:

Milvus supports full text search. Use BM25 for keyword relevance. Filters can narrow results.

تكوين أداة التمييز

لتمييز مصطلحات البحث في البحث عن النص الكامل في BM25، قم بإنشاء LexicalHighlighter وقم بتمكين تمييز مصطلحات البحث للبحث عن النص الكامل في BM25:

from pymilvus import LexicalHighlighter

highlighter = LexicalHighlighter(
    pre_tags=["{"],              # Tag inserted before each highlighted term
    post_tags=["}"],             # Tag inserted after each highlighted term
    highlight_search_text=True   # Enable search term highlighting for BM25 full text search
)

في هذا المثال

  • pre_tags و post_tags التحكم في كيفية ظهور النص المميز في الإخراج. في هذه الحالة، يتم تغليف المصطلحات المتطابقة بـ {} (على سبيل المثال، {term}). يمكنك أيضًا توفير علامات متعددة كقائمة (على سبيل المثال، ["<b>", "<i>"]). عندما يتم تمييز مصطلحات متعددة، يتم تطبيق العلامات بالترتيب وتدويرها حسب تسلسل المطابقة.

  • highlight_search_text=True يخبر ميلفوس باستخدام مصطلحات البحث في بحث النص الكامل BM25 كمصدر للمصطلحات المميزة.

بمجرد إنشاء كائن التمييز، قم بتطبيق تكوينه على طلب البحث عن النص الكامل BM25:

results = client.search(
    ...,
    data=["BM25"],      # Search term used in BM25 full text search
    highlighter=highlighter # Pass highlighter config here
)

إخراج التظليل

عند تمكين التظليل، يقوم Milvus بإرجاع النص المميز في حقل مخصص highlight. بشكل افتراضي، يتم إرجاع المخرجات المميزة كجزء يبدأ من أول مصطلح مطابق.

في هذا المثال، مصطلح البحث هو "BM25" ، لذلك يتم تمييزه في النتيجة التي تم إرجاعها:

{
    ...,
    "highlight": {
        "text": [
            "{BM25} for keyword relevance. Filters can narrow results."
        ]
    }
}

للتحكم في موضع الأجزاء التي تم إرجاعها وطولها وعددها، راجع إرجاع النص المميز كأجزاء.

تمييز مصطلح الاستعلام في التصفية

بالإضافة إلى تمييز مصطلحات البحث، يمكنك تمييز المصطلحات المستخدمة في تعبيرات التصفية المستندة إلى النص.

في الوقت الحالي، يتم دعم شرط التصفية TEXT_MATCH فقط لتمييز مصطلح الاستعلام. لمعرفة المزيد، راجع مطابقة النص.

في هذا السيناريو، تأتي المصطلحات المميزة من تعبيرات التصفية المستندة إلى النص. تحدد التصفية المستندات التي تتطابق مع المستندات، بينما تقوم أداة التمييز بتمييز امتدادات النص المتطابقة.

افترض أن المحتوى التالي مخزن في حقل نصي:

This document explains how text filtering works in Milvus.

تكوين أداة التمييز

لتمييز مصطلحات الاستعلام المستخدمة في التصفية، قم بإنشاء LexicalHighlighter وحدد highlight_query الذي يتوافق مع شرط التصفية:

from pymilvus import LexicalHighlighter

highlighter = LexicalHighlighter(
    pre_tags=["{"],              # Tag inserted before each highlighted term
    post_tags=["}"],             # Tag inserted after each highlighted term
    highlight_query=[{
        "type": "TextMatch",     # Text filtering type
        "field": "text",         # Target text field
        "text": "text filtering" # Terms to highlight
    }]
)

في هذا التكوين

  • pre_tags و post_tags التحكم في كيفية ظهور النص المميز في الإخراج. في هذه الحالة، يتم تغليف المصطلحات المتطابقة بـ {} (على سبيل المثال، {term}). يمكنك أيضًا توفير علامات متعددة كقائمة (على سبيل المثال، ["<b>", "<i>"]). عند تمييز مصطلحات متعددة، يتم تطبيق العلامات بالترتيب وتدويرها حسب تسلسل المطابقة.

  • highlight_query يحدد مصطلحات التصفية التي يجب تمييزها.

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

results = client.search(
    ...,
    filter='TEXT_MATCH(text, "text filtering")',
    highlighter=highlighter # Pass highlighter config here
)

تمييز المخرجات

عندما يتم تمكين تمييز مصطلح الاستعلام للتصفية، يقوم ميلفوس بإرجاع النص المميز في حقل مخصص highlight. بشكل افتراضي، يتم إرجاع المخرجات المميزة كجزء يبدأ من أول مصطلح مطابق.

في هذا المثال، المصطلح المطابق الأول هو "text" ، لذلك يبدأ النص المميز الذي تم إرجاعه من هذا الموضع:

{
    ...,
    "highlight": {
        "text": [
            "{text} {filtering} works in Milvus."
        ]
    }
}

للتحكم في موضع الأجزاء التي تم إرجاعها وطولها وعددها، راجع إرجاع النص المميز كأجزاء.

إخراج التظليل القائم على الأجزاء

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

افترض أن المحتوى التالي مخزن في حقل نصي:

Milvus supports full text search. Use BM25 for keyword relevance. Filters can narrow results.

تكوين أداة التمييز

للتحكم في شكل الأجزاء المميزة، قم بتكوين الخيارات المتعلقة بالأجزاء في LexicalHighlighter:

from pymilvus import LexicalHighlighter

highlighter = LexicalHighlighter(
    pre_tags=["{"],
    post_tags=["}"],
    highlight_search_text=True,
    fragment_offset=5,     # Number of characters to reserve before the first matched term
    fragment_size=60,      # Max. length of each fragment to return
    num_of_fragments=1     # Max. number of fragments to return
)

في هذا التكوين

  • fragment_offset يحتفظ بالسياق البادئ قبل المصطلح المميز الأول.

  • fragment_size يحدد مقدار النص الذي يتم تضمينه في كل جزء.

  • num_of_fragments يتحكم في عدد الأجزاء التي يتم إرجاعها.

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

results = client.search(
    ...,
    data=["BM25"],
    highlighter=highlighter # Pass highlighter config here
)

تسليط الضوء على الإخراج

مع تمكين التظليل المستند إلى الأجزاء، يقوم Milvus بإرجاع النص المميز كأجزاء في الحقل highlight:

{
    ...,
    "highlight": {
        "text": [
            "Use {BM25} for keyword relevance. Filters can narrow results."
        ]
    }
}

في هذا الإخراج:

  • لا يبدأ الجزء بالضبط عند {BM25} لأنه تم تعيين fragment_offset.

  • يتم إرجاع جزء واحد فقط لأن num_of_fragments هو 1.

  • يتم تحديد طول الجزء ب fragment_size.

أمثلة

التحضير

قبل استخدام أداة التمييز، تأكد من تكوين مجموعتك بشكل صحيح.

يقوم المثال أدناه بإنشاء مجموعة تدعم البحث عن النص الكامل BM25 والاستعلامات TEXT_MATCH ، ثم إدراج نماذج من المستندات.

قم بإعداد مجموعتك

from pymilvus import (
    MilvusClient,
    DataType,
    Function,
    FunctionType,
    LexicalHighlighter,
)

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

# Clean up existing collection
if client.has_collection(COLLECTION_NAME):
    client.drop_collection(COLLECTION_NAME)

# Define schema
schema = client.create_schema(enable_dynamic_field=False)
schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True, auto_id=True)
schema.add_field(
    field_name="text",
    datatype=DataType.VARCHAR,
    max_length=2000,
    enable_analyzer=True,  # Required for BM25
    enable_match=True,     # Required for TEXT_MATCH
)
schema.add_field(field_name="sparse_vector", datatype=DataType.SPARSE_FLOAT_VECTOR)

# Add BM25 function
schema.add_function(Function(
    name="text_bm25",
    function_type=FunctionType.BM25,
    input_field_names=["text"],
    output_field_names=["sparse_vector"],
))

# Create index
index_params = client.prepare_index_params()
index_params.add_index(
    field_name="sparse_vector",
    index_type="SPARSE_INVERTED_INDEX",
    metric_type="BM25",
    params={"inverted_index_algo": "DAAT_MAXSCORE", "bm25_k1": 1.2, "bm25_b": 0.75},
)

client.create_collection(collection_name=COLLECTION_NAME, schema=schema, index_params=index_params)

# Insert sample documents
docs = [
    "my first test doc",
    "my second test doc",
    "my first test doc. Milvus is an open-source vector database built for GenAI applications.",
    "my second test doc. Milvus is an open-source vector database that suits AI applications "
    "of every size from running a demo chatbot to building web-scale search.",
]
client.insert(collection_name=COLLECTION_NAME, data=[{"text": t} for t in docs])
print(f"✓ Collection created with {len(docs)} documents\n")

# Helper for search params
SEARCH_PARAMS = {"metric_type": "BM25", "params": {"drop_ratio_search": 0.0}}

# Expected output:
# ✓ Collection created with 4 documents

يوضح هذا المثال كيفية تمييز مصطلحات البحث في بحث النص الكامل BM25.

  • يستخدم البحث عن النص الكامل BM25 "test" كمصطلح بحث

  • تقوم أداة التمييز بتغليف جميع تكرارات "اختبار" بالعلامات { و }

highlighter = LexicalHighlighter(
    pre_tags=["{"],
    post_tags=["}"],
    highlight_search_text=True,  # Highlight BM25 query terms
)

results = client.search(
    collection_name=COLLECTION_NAME,
    data=["test"],
    anns_field="sparse_vector",
    limit=10,
    search_params=SEARCH_PARAMS,
    output_fields=["text"],
    highlighter=highlighter,
)

for hit in results[0]:
    print(f"  {hit.get('highlight', {}).get('text', [])}")
print()

المخرجات المتوقعة

['{test} doc']
['{test} doc']
['{test} doc. Milvus is an open-source vector database built for GenAI applications.']
['{test} doc. Milvus is an open-source vector database that suits AI applications of every size from run']

مثال 2: تمييز مصطلحات الاستعلام في التصفية

يوضح هذا المثال كيفية تمييز المصطلحات المتطابقة بواسطة مرشح TEXT_MATCH.

  • يستخدم BM25 بحث النص الكامل "test" كمصطلح استعلام

  • تضيف المعلمة queries المعلمة "my doc" إلى قائمة التظليل

  • تقوم أداة التظليل بتمييز جميع المصطلحات المتطابقة ("my" ، "test" ، ، "doc") مع { و }

highlighter = LexicalHighlighter(
    pre_tags=["{"],
    post_tags=["}"],
    highlight_search_text=True,   # Also highlight BM25 term
    highlight_query=[                     # Additional TEXT_MATCH terms to highlight
        {"type": "TextMatch", "field": "text", "text": "my doc"},
    ],
)

results = client.search(
    collection_name=COLLECTION_NAME,
    data=["test"],
    anns_field="sparse_vector",
    limit=10,
    search_params=SEARCH_PARAMS,
    output_fields=["text"],
    highlighter=highlighter,
)

for hit in results[0]:
    print(f"  {hit.get('highlight', {}).get('text', [])}")
print()

الناتج المتوقع

['{my} first {test} {doc}']
['{my} second {test} {doc}']
['{my} first {test} {doc}. Milvus is an open-source vector database built for GenAI applications.']
['{my} second {test} {doc}. Milvus is an open-source vector database that suits AI applications of every siz']

مثال 3: إرجاع التظليل على شكل أجزاء

في هذا المثال، يبحث الاستعلام عن "Milvus" ويعيد أجزاء التظليل في الإعدادات التالية:

  • fragment_offset يحتفظ بما يصل إلى 20 حرفًا قبل أول جزء مميز كسياق رئيسي (الافتراضي هو 0).

  • fragment_size يحد كل جزء إلى 60 حرفًا تقريبًا (الافتراضي هو 100).

  • num_of_fragments يحد من عدد الأجزاء التي تم إرجاعها لكل قيمة نصية (الافتراضي هو 5).

highlighter = LexicalHighlighter(
    pre_tags=["{"],
    post_tags=["}"],
    highlight_search_text=True,
    fragment_offset=20,  # Keep 20 chars before match
    fragment_size=60,    # Max ~60 chars per fragment
)

results = client.search(
    collection_name=COLLECTION_NAME,
    data=["Milvus"],
    anns_field="sparse_vector",
    limit=10,
    search_params=SEARCH_PARAMS,
    output_fields=["text"],
    highlighter=highlighter,
)

for i, hit in enumerate(results[0]):
    frags = hit.get('highlight', {}).get('text', [])
    print(f"  Doc {i+1}: {frags}")
print()

الإخراج المتوقع

Doc 1: ['my first test doc. {Milvus} is an open-source vector database ']
Doc 2: ['my second test doc. {Milvus} is an open-source vector database']

مثال 4: تمييز الاستعلامات المتعددة

عند البحث باستعلامات متعددة في بحث النص الكامل BM25، يتم تمييز نتائج كل استعلام بشكل مستقل. تحتوي نتائج الاستعلام الأول على إبرازات لمصطلح البحث الخاص به، وتحتوي نتائج الاستعلام الثاني على إبرازات لمصطلح البحث الخاص به، وهكذا. يستخدم كل استعلام نفس التكوين highlighter ولكن يتم تطبيقه بشكل مستقل.

في المثال أدناه:

  • يبرز الاستعلام الأول "test" في مجموعة النتائج الخاصة به

  • يبرز الاستعلام الثاني "Milvus" في مجموعة النتائج الخاصة به

highlighter = LexicalHighlighter(
    pre_tags=["{"],
    post_tags=["}"],
    highlight_search_text=True,
)

results = client.search(
    collection_name=COLLECTION_NAME,
    data=["test", "Milvus"],  # Two queries
    anns_field="sparse_vector",
    limit=2,
    search_params=SEARCH_PARAMS,
    output_fields=["text"],
    highlighter=highlighter,
)

for nq_idx, hits in enumerate(results):
    query_term = ["test", "Milvus"][nq_idx]
    print(f"  Query '{query_term}':")
    for hit in hits:
        print(f"    {hit.get('highlight', {}).get('text', [])}")
print()

الناتج المتوقع

Query 'test':
  ['{test} doc']
  ['{test} doc']
Query 'Milvus':
  ['{Milvus} is an open-source vector database built for GenAI applications.']
  ['{Milvus} is an open-source vector database that suits AI applications of every size from running a dem']

مثال 5: علامات HTML مخصصة

يمكنك استخدام أي علامات للتمييز، مثل علامات HTML الآمنة لواجهات مستخدم الويب. هذا مفيد عند عرض نتائج البحث في المتصفح.

highlighter = LexicalHighlighter(
    pre_tags=["<mark>"],
    post_tags=["</mark>"],
    highlight_search_text=True,
)

results = client.search(
    collection_name=COLLECTION_NAME,
    data=["test"],
    anns_field="sparse_vector",
    limit=2,
    search_params=SEARCH_PARAMS,
    output_fields=["text"],
    highlighter=highlighter,
)

for hit in results[0]:
    print(f"  {hit.get('highlight', {}).get('text', [])}")
print()

المخرجات المتوقعة

['<mark>test</mark> doc']
['<mark>test</mark> doc']