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

TRIE

يقوم فهرس " TRIE " في Milvus بتنظيم قيم حقل " VARCHAR " في شجرة بادئة ( trie). يتوافق كل حرف في السلسلة مع حافة في الشجرة، ويتم تخزين البادئات المشتركة مرة واحدة فقط. تتيح هذه البنية إجراء عمليات البحث الدقيق عن السلاسل ومطابقة البادئات بسرعة، دون الحاجة إلى مسح كل قيمة في الحقل.

استخدم فهرس " TRIE " إذا كنت تُجري استعلامات بشكل متكرر باستخدام:

  • المساواة الدقيقة لقيم السلاسل، مثل category == "books"

  • تصفية البادئات، مثل name LIKE "abc%"

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

TRIE يتم دعم هذه الميزة فقط في حقول " VARCHAR ". لفهرسة قيمة سلسلة داخل حقل " JSON "، قم بتحويل المسار إلى " VARCHAR " واستخدم فهرس NGRAM بدلاً من ذلك.

كيفية العمل

يُنفذ Milvus " TRIE " على مرحلتين:

  1. إنشاء الفهرس

    • أثناء الاستيعاب، يقرأ Milvus كل قيمة من قيم الحقل المفهرس.

    • يتم إدراج القيم في شجرة تري (trie): حيث يتم تخزين الأحرف على طول الحواف، وتسجل كل عقدة طرفية معرّفات الكيانات التي تشترك في تلك السلسلة.

    • يتم حفظ الشجرة المكتملة كفهرس.

  2. تسريع الاستعلامات

    • بالنسبة لمشكلة المساواة، يتتبع Milvus الشجرة حرفًا حرفًا للوصول إلى العقدة الخاصة بالقيمة الدقيقة ويعرض معرّفات الكيانات الخاصة بها.

    • بالنسبة للبادئة، يتتبع Milvus العقدة المطابقة للبادئة ويجمع معرّفات الكيانات في شجرتها الفرعية.

    • يتم تمرير معرّفات الكيانات المطابقة إلى منفّذ الاستعلام لتجميع النتيجة النهائية.

بالنسبة لمرشحات المساواة والبادئة، تكون تكلفة البحث متناسبة مع طول السلسلة بدلاً من عدد الكيانات، مما يحافظ على سرعة هذه الاستعلامات في المجموعات الكبيرة.

إنشاء فهرس TRIE

يمكنك إنشاء فهرس TRIE ( TRIE ) على حقل VARCHAR. ولا يلزم وجود معلمات إضافية.

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

from pymilvus import MilvusClient

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

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

# Prepare index parameters
index_params = client.prepare_index_params()

# Add TRIE index on the "category" field
index_params.add_index(
    field_name="category",     # Target VARCHAR field
    index_type="TRIE",         # Index type is TRIE
    index_name="category_trie" # Optional, name your index
)

# Create the index on the collection
client.create_index(
    collection_name="product_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.Collections;

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

client.createIndex(CreateIndexReq.builder()
        .collectionName("product_catalog")
        .indexParams(Collections.singletonList(IndexParam.builder()
                .fieldName("category")
                .indexType(IndexParam.IndexType.TRIE)
                .indexName("category_trie")
                .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())
}

_, err = cli.CreateIndex(ctx, milvusclient.NewCreateIndexOption("product_catalog", "category", index.NewTrieIndex()).WithIndexName("category_trie"))

if err != nil {
    log.Fatal("failed to create index: ", err.Error())
}
use milvus::v2::prelude::*;

let config = ConnectConfig::new().uri("http://localhost:19530");

let client = ClientV2::new(&config).await?;

client
    .create_index(
        CreateIndexRequest::builder()
            .collection_name("product_catalog")
            .index_param(
                IndexParam::new()
                    .field_name("category")
                    .index_type(IndexType::Trie)
                    .index_name("category_trie"),
            )
            .build()?,
    )
    .await?;
#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->CreateIndex(milvus::CreateIndexRequest().WithCollectionName("product_catalog")
        .AddIndex(milvus::IndexDesc("category", "category_trie", milvus::IndexType::TRIE)));

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: "product_catalog",
    field_name: "category",
    index_type: "TRIE",
    index_name: "category_trie",
});
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": "product_catalog",
    "indexParams": [
        {
            "fieldName": "category",
            "indexName": "category_trie",
            "indexType": "TRIE"
        }
    ]
}'

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

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

يعمل فهرس TRIE على تسريع أنماط التصفية التالية في حقل VARCHAR:

  • المساواة

    filter = 'category == "books"'
    
  • العضوية

    filter = 'category in ["books", "electronics"]'
    
  • مطابقة البادئة

    filter = 'category LIKE "elec%"'
    
  • النطاق

    filter = 'category >= "a" and category < "m"'
    

    قد يؤدي تقييم النطاق إلى زيارة عدة سلاسل مفهرسة.

يمكن أيضًا تقييم أنماط اللاحقة والسلسلة الفرعية والتعبيرات العادية ( LIKE ) مقابل السلاسل المفهرسة، ولكنها قد تتطلب تقييم العديد من القيم المتميزة. إذا كان عبء العمل الخاص بك يغلب عليه مطابقة السلاسل الفرعية أو التعبيرات العادية، ففكر في استخدام فهرس FMINDEX أو NGRAM بدلاً من ذلك.

إزالة فهرس

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

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

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

client.drop_index(
    collection_name="product_catalog",   # Name of the collection
    index_name="category_trie"           # 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("product_catalog")
        .indexName("category_trie")
        .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("product_catalog", "category_trie"))

if err != nil {
    log.Fatal("failed to drop index: ", err.Error())
}
use milvus::v2::prelude::*;

let config = ConnectConfig::new().uri("http://localhost:19530");

let client = ClientV2::new(&config).await?;

client
    .drop_index(
        DropIndexRequest::builder()
            .collection_name("product_catalog")
            .index_name("category_trie")
            .build()?,
    )
    .await?;
#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("product_catalog")
        .WithIndexName("category_trie"));

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: "product_catalog",
    index_name: "category_trie",
});
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": "product_catalog",
    "indexName": "category_trie"
}'

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

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

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

  • المعلمات: لا توجد معلمات مؤشر مطلوبة.

  • مطابقة الأنماط: يُعد « TRIE » الأسرع في مرشحات المساواة والبادئة. يتم دعم مرشحات النطاق، ولكنها قد تتطلب فحص عدة سلاسل مفهرسة. يمكن تقييم أنماط اللاحقة والسلسلة الفرعية و LIKE العامة، ولكنها قد تتطلب فحص العديد من السلاسل المفهرسة.

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

  • استخدم TRIE عندما تكون عوامل التصفية الخاصة بك تعتمد بشكل أساسي على عمليات البحث الدقيقة أو مطابقة البادئة.

  • إذا كان عبء العمل الخاص بك يعتمد على مرشحات السلاسل الفرعية (LIKE "%abc%") أو مرشحات التعبيرات العادية، فاستخدم FMINDEX للمطابقة المثبتة الدقيقة أو NGRAM لتضييق نطاق المرشحين بدلاً من ذلك.

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

جرب Managed Milvus مجاناً

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

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

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