• نبذة عن Milvus
  • ابدأ الآن
  • المفاهيم
  • دليل المستخدم
  • استيراد البيانات
  • أدوات الذكاء الاصطناعي
  • دليل الإدارة
  • الأدوات
  • عمليات الدمج
  • الدروس التعليمية
  • الأسئلة الشائعة
  • API Reference

FMINDEX

يُعد فهرس " FMINDEX " في Milvus فهرسًا دقيقًا للسلسلة الفرعية على مستوى البايت لحقول " VARCHAR ". وهو يستجيب لاستعلامات " LIKE " المثبتة باستخدام مطابقة البادئة أو الوسطية أو اللاحقة، ويعرض النتائج المطابقة تمامًا دون الحاجة إلى إعادة فحص المرشحين.

استخدم مؤشر « FMINDEX » إذا كنت تُجري بشكل متكرر عمليات تصفية لسلسلة فرعية، مثل:

  • title LIKE "vector%" (البادئة)

  • title LIKE "%database" (اللاحقة)

  • title LIKE "%vector database%" (وسط / سلسلة فرعية)

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

أنواع البيانات المدعومة

FMINDEX يتم دعمها فقط في حقول VARCHAR. ولا تدعم حقول JSON أو مسارات JSON التي تم تحويلها إلى VARCHAR.

كيفية عمله

FMINDEX هو فهرس FM للنص الكامل، وهو بنية مضغوطة مبنية من تحويل بوروز-ويلر (BWT) لقيم الحقول المربوطة، جنبًا إلى جنب مع مصفوفة لاحقة عينة وشجرة الموجات الصغيرة لاستعلامات الترتيب. يدعم هذا التخطيط البحث العكسي: عند وجود نمط معين، يتتبع Milvus هذا النمط من آخر حرف فيه إلى أول حرف للعثور على النطاق الدقيق للكيانات التي يحتوي نصها على هذا النمط.

عند إجراء الاستعلام، يستخدم Milvus الفهرس من أجل:

  1. تحديد مواقع التطابقات للقيمة الثابتة المثبتة المستخرجة من نمط « LIKE ».

  2. إرجاع معرّفات الكيانات الدقيقة للقيم الثابتة البادئة واللاحقة والداخلية دون إعادة التحقق من القيم الأصلية.

بالنسبة للأنماط التي تحتوي على عدة قيم ثابتة غير متجاورة ( LIKE العام) أو تعبيرات منتظمة معقدة، قد ينتج عن FMINDEX مرشحون يقوم Milvus بعد ذلك بالتحقق منهم مقابل القيم الأصلية.

إنشاء فهرس FMINDEX

يمكنك إنشاء فهرس FMINDEX في حقل VARCHAR. كلا معلمتي الإنشاء اختياريتان؛ اتركهما غير محددتين لاستخدام القيم الافتراضية للخادم.

المعلمةالوصفالقيم المسموح بهاالقيمة الافتراضية
fm_sa_sample_rateمعدل أخذ العينات لمصفوفة اللاحقات. يوازن بين حجم الفهرس وزمن الوصول؛ ولا يؤثر على استعلامات العد فقط.عدد صحيح من 4 إلى 2568
fm_block_bytesدقة كتلة دليل الترتيب بالبايت. تؤدي الكتل الأكبر حجمًا إلى تقليص حجم الدليل المقيم.8 أو 16 أو 32 أو 64 أو 12864

يوضح المثال أدناه كيفية إنشاء فهرس " FMINDEX " على حقل " VARCHAR ":

from pymilvus import MilvusClient

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

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

# Prepare index parameters
index_params = client.prepare_index_params()

# Add FMINDEX index on the "text" field
index_params.add_index(
    field_name="text",           # Target VARCHAR field
    index_type="FMINDEX",        # Index type is FMINDEX
    index_name="fmindex_index",  # Custom name for the index
    fm_sa_sample_rate=8,         # Optional: suffix-array sampling rate (4-256, default 8)
    fm_block_bytes=64            # Optional: block granularity in bytes (8/16/32/64/128, default 64)
)

# Create the index on the collection
client.create_index(
    collection_name="log_catalog",
    index_params=index_params
)
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.common.IndexParam;
import io.milvus.v2.service.index.request.CreateIndexReq;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

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

Map<String, Object> params = new HashMap<>();
params.put("fm_sa_sample_rate", "8");
params.put("fm_block_bytes", "64");

client.createIndex(CreateIndexReq.builder()
        .collectionName("log_catalog")
        .indexParams(Arrays.asList(
                IndexParam.builder().fieldName("text").indexType(IndexParam.IndexType.FMINDEX)
                        .indexName("fmindex_index")
                        .extraParams(params)
                        .build()))
        .build());
import (
    "context"
    "log"

    "github.com/milvus-io/milvus/client/v3/index"
    "github.com/milvus-io/milvus/client/v3/milvusclient"
)

ctx := context.Background()

cli, err := milvusclient.New(ctx, &milvusclient.ClientConfig{
    Address: "http://localhost:19530",
})

if err != nil {
    log.Fatal("failed to connect to milvus server: ", err.Error())
}

idx := index.NewFMIndex().WithSaSampleRate(8).WithBlockBytes(64)

_, err = cli.CreateIndex(ctx, milvusclient.NewCreateIndexOption("log_catalog", "text", idx).WithIndexName("fmindex_index"))

if err != nil {
    log.Fatal("failed to create index: ", err.Error())
}
#include <iostream>
#include "milvus/MilvusClientV2.h"

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

auto status = client->Connect(milvus::ConnectParam("http://localhost:19530"));

if (!status.IsOk()) {
    std::cout << status.Message() << std::endl;
}

milvus::IndexDesc fmindex_index("text", "fmindex_index", milvus::IndexType::FMINDEX);
fmindex_index.AddExtraParam("fm_sa_sample_rate", "8");
fmindex_index.AddExtraParam("fm_block_bytes", "64");

status = client->CreateIndex(milvus::CreateIndexRequest().WithCollectionName("log_catalog")
        .AddIndex(fmindex_index));

if (!status.IsOk()) {
    std::cout << status.Message() << std::endl;
}
import { MilvusClient } from "@zilliz/milvus2-sdk-node";

const client = new MilvusClient({ address: "http://localhost:19530" });

await client.createIndex({
    collection_name: "log_catalog",
    field_name: "text",
    index_type: "FMINDEX",
    index_name: "fmindex_index",
    params: { fm_sa_sample_rate: 8, fm_block_bytes: 64 },
});
export CLUSTER_ENDPOINT="http://localhost:19530"
export TOKEN="root:Milvus"

curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/indexes/create" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--header "Request-Timeout: 10" \
-d '{
    "collectionName": "log_catalog",
    "indexParams": [
        {
            "fieldName": "text",
            "indexName": "fmindex_index",
            "params": {
                "index_type": "FMINDEX",
                "fm_sa_sample_rate": 8,
                "fm_block_bytes": 64
            }
        }
    ]
}'

# {
#     "code": 0,
#     "data": {}
# }

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

FMINDEX يعمل على تسريع أنماط التصفية التالية على حقل VARCHAR. يتم تحليل القيم الثابتة للبادئة واللاحقة والوسطية المثبتة بدقة من الفهرس؛ بينما تنتج أنماط LIKE العامة وأنماط التعبيرات النمطية (regex) مرشحين يقوم Milvus بالتحقق من صحتها مقارنةً بالقيم الأصلية.

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

    filter = 'text LIKE "vector%"'
    
  • مطابقة اللاحقة

    filter = 'text LIKE "%database"'
    
  • مطابقة البينية / السلسلة الفرعية

    filter = 'text LIKE "%vector database%"'
    
  • LIKE عام (النتائج المحتملة)

    filter = 'text LIKE "a%b_c"'
    
  • التعبيرات النمطية (النتائج المحتملة)

    filter = 'text =~ "error.*timeout"'
    

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

إزالة فهرس

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

  • في الإصدار 2.6.3 أو ما قبله، يجب تحرير المجموعة قبل حذف مؤشر سكالي.

  • ابتداءً من الإصدار 2.6.4 أو الأحدث، يمكنك حذف مؤشر سكالي مباشرةً بمجرد انتفاء الحاجة إليه — دون الحاجة إلى تحرير المجموعة أولاً.

client.drop_index(
    collection_name="log_catalog",   # Name of the collection
    index_name="fmindex_index"       # Name of the index to drop
)
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.service.index.request.DropIndexReq;

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

client.dropIndex(DropIndexReq.builder()
        .collectionName("log_catalog")
        .indexName("fmindex_index")
        .build());
import (
    "context"
    "log"

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

ctx := context.Background()

cli, err := milvusclient.New(ctx, &milvusclient.ClientConfig{
    Address: "http://localhost:19530",
})

if err != nil {
    log.Fatal("failed to connect to milvus server: ", err.Error())
}

err = cli.DropIndex(ctx, milvusclient.NewDropIndexOption("log_catalog", "fmindex_index"))

if err != nil {
    log.Fatal("failed to drop index: ", err.Error())
}
#include <iostream>
#include "milvus/MilvusClientV2.h"

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

auto status = client->Connect(milvus::ConnectParam("http://localhost:19530"));

if (!status.IsOk()) {
    std::cout << status.Message() << std::endl;
}

status = client->DropIndex(milvus::DropIndexRequest()
        .WithCollectionName("log_catalog")
        .WithIndexName("fmindex_index"));

if (!status.IsOk()) {
    std::cout << status.Message() << std::endl;
}
import { MilvusClient } from "@zilliz/milvus2-sdk-node";

const client = new MilvusClient({ address: "http://localhost:19530" });

await client.dropIndex({
    collection_name: "log_catalog",
    index_name: "fmindex_index",
});
export CLUSTER_ENDPOINT="http://localhost:19530"
export TOKEN="root:Milvus"

curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/indexes/drop" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--header "Request-Timeout: 10" \
-d '{
    "collectionName": "log_catalog",
    "indexName": "fmindex_index"
}'

# {
#     "code": 0,
#     "data": {}
# }

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

  • أنواع الحقول: تعمل مع حقول VARCHAR فقط. لمزيد من المعلومات حول أنواع البيانات، راجع حقل السلسلة.

  • توافق الإصدارات: تتطلب ميزة « FMINDEX » محرك الفهرس القياسي الإصدار 5 أو أحدث.

  • توافر SDK: لا يتضمن SDK لـ Rust v2 حتى الآن نوع الفهرس FMINDEX.

  • المطابقة التامة: تُرجع القيم الثابتة لـ LIKE ذات البادئة واللاحقة والوسطية المثبتة مطابقات تامة دون إعادة فحص المرشحين.

  • المرشحات: قد تنتج أنماط LIKE وأنماط التعبيرات النمطية العامة مرشحات يقوم Milvus بالتحقق منها مقابل القيم الأصلية. عندما لا يوفر النمط تصفية مفيدة أو يكون حله مكلفًا للغاية، قد يقوم Milvus بمسح الحقل بدلاً من ذلك.

  • الثبات: لا يمكن تغيير القيم الثابتة ( fm_sa_sample_rate ) والقيم الثابتة في الموضع ( fm_block_bytes ) في مكانها — قم بإعادة بناء الفهرس لتعديلها.

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

  • استخدم FMINDEX للبحث عن سلاسل فرعية مطابقة تمامًا في حقول VARCHAR الطويلة، خاصةً عندما تكون إعادة فحص المرشحين NGRAM مكلفة.

  • احتفظ بقيمة fm_block_bytes على الإعداد الافتراضي 64 لمعظم أحمال العمل؛ وقم بزيادتها لتقليص حجم الدليل المقيم عندما تكون الذاكرة محدودة.

  • يؤدي خفض fm_sa_sample_rate إلى تحسين زمن استجابة locate على حساب فهرس أكبر؛ قم بزيادته لتقليل حجم الفهرس عندما تكون الاستعلامات في الغالب عبارة عن عد فقط.

ترجمة بواسطةDeepL

جرب Managed Milvus مجاناً

Zilliz Cloud خالي من المتاعب، ويعمل بواسطة Milvus ويعمل بسرعة 10 أضعاف.

ابدأ
التعليقات

هل كانت هذه الصفحة مفيدة؟