FMINDEX
يُعد فهرس " FMINDEX " في Milvus فهرسًا دقيقًا للسلسلة الفرعية على مستوى البايت لحقول " VARCHAR ". وهو يستجيب لاستعلامات " LIKE " المثبتة باستخدام مطابقة البادئة أو الوسطية أو اللاحقة، ويعرض النتائج المطابقة تمامًا دون الحاجة إلى إعادة فحص المرشحين.
استخدم مؤشر « FMINDEX » إذا كنت تُجري بشكل متكرر عمليات تصفية لسلسلة فرعية، مثل:
title LIKE "vector%"(البادئة)title LIKE "%database"(اللاحقة)title LIKE "%vector database%"(وسط / سلسلة فرعية)
على عكس NGRAM ، الذي يضيق نطاق النتائج المرشحة ثم يعيد فحصها، يمكن لـ FMINDEX حل أنماط البادئة واللاحقة والداخلية المثبتة مباشرةً من الفهرس.
أنواع البيانات المدعومة
VARCHARالحقول. لمزيد من التفاصيل، راجع حقل السلسلة.
FMINDEX يتم دعمها فقط في حقول VARCHAR. ولا تدعم حقول JSON أو مسارات JSON التي تم تحويلها إلى VARCHAR.
كيفية عمله
FMINDEX هو فهرس FM للنص الكامل، وهو بنية مضغوطة مبنية من تحويل بوروز-ويلر (BWT) لقيم الحقول المربوطة، جنبًا إلى جنب مع مصفوفة لاحقة عينة وشجرة الموجات الصغيرة لاستعلامات الترتيب. يدعم هذا التخطيط البحث العكسي: عند وجود نمط معين، يتتبع Milvus هذا النمط من آخر حرف فيه إلى أول حرف للعثور على النطاق الدقيق للكيانات التي يحتوي نصها على هذا النمط.
عند إجراء الاستعلام، يستخدم Milvus الفهرس من أجل:
تحديد مواقع التطابقات للقيمة الثابتة المثبتة المستخرجة من نمط «
LIKE».إرجاع معرّفات الكيانات الدقيقة للقيم الثابتة البادئة واللاحقة والداخلية دون إعادة التحقق من القيم الأصلية.
بالنسبة للأنماط التي تحتوي على عدة قيم ثابتة غير متجاورة ( LIKE العام) أو تعبيرات منتظمة معقدة، قد ينتج عن FMINDEX مرشحون يقوم Milvus بعد ذلك بالتحقق منهم مقابل القيم الأصلية.
إنشاء فهرس FMINDEX
يمكنك إنشاء فهرس FMINDEX في حقل VARCHAR. كلا معلمتي الإنشاء اختياريتان؛ اتركهما غير محددتين لاستخدام القيم الافتراضية للخادم.
| المعلمة | الوصف | القيم المسموح بها | القيمة الافتراضية |
|---|---|---|---|
fm_sa_sample_rate | معدل أخذ العينات لمصفوفة اللاحقات. يوازن بين حجم الفهرس وزمن الوصول؛ ولا يؤثر على استعلامات العد فقط. | عدد صحيح من 4 إلى 256 | 8 |
fm_block_bytes | دقة كتلة دليل الترتيب بالبايت. تؤدي الكتل الأكبر حجمًا إلى تقليص حجم الدليل المقيم. | 8 أو 16 أو 32 أو 64 أو 128 | 64 |
يوضح المثال أدناه كيفية إنشاء فهرس " 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 على حساب فهرس أكبر؛ قم بزيادته لتقليل حجم الفهرس عندما تكون الاستعلامات في الغالب عبارة عن عد فقط.