نمایه
یکی از ویژگیهای کلیدی Qdrant ترکیب موثر از نمایه بردار و نمایه سنتی است. این موضوع بسیار حیاتی است زیرا داشتن تنها یک نمایه بردار کافی نیست تا جستجوی موثر بردار تحت شرایط فیلترینگ را فراهم کند. به زبان ساده، نمایه بردار جستجوی بردار را شتاب میبخشد در حالی که نمایه بار قانونی عملکرد فیلترینگ را شتاب میبخشد.
نمایه در یک پاراگراف به صورت مستقل وجود دارد، اما پارامترهای خود نمایه برای کل مجموعه پیکربندی شدهاند.
همه پاراگرافها به طور خودکار نمایه ندارند. این بستگی به الزامات تنظیمات بهینهسازی دارد و معمولاً به تعداد نقاط ذخیره شده وابسته است.
نمایه بار
نمایه بار در Qdrant به نمایه بار در یک پایگاه داده سند محور سنتی شبیه است. این نمایه برای فیلدها و انواع خاصی ساخته میشود تا به سرعت نقاط بر اساس شرایط فیلتر مربوطه بازیابی شود.
همچنین برای تخمین دقیق کاردینالیته شرایط فیلترینگ استفاده میشود که به برنامهریزی پرس و جو کمک میکند استراتژیهای جستجو را انتخاب کند.
ساختن نمایه نیازمند منابع محاسباتی و حافظه اضافی است، بنابراین حیاتی است که با دقت فیلدهایی که باید نمایهگذاری شوند را انتخاب کنید. Qdrant این انتخاب را به جای شما نمیکند بلکه آن را به کاربر واگذار میکند.
برای علامتگذاری یک فیلد به عنوان قابل نمایه گذاری، میتوان از روش زیر استفاده کرد:
PUT /collections/{collection_name}/index
{
"field_name": "نام فیلد برای نمایه گذاری",
"field_schema": "keyword"
}
انواع فیلد در دسترس عبارتند از:
-
keyword
- برای بار کلیدی، تأثیرگذار برای شرایط فیلترینگ مطابقت دارد. -
integer
- برای بار عدد صحیح، تأثیرگذار برای شرایط فیلترینگ مطابقت و دامنه مطالبات دارد. -
float
- برای بار اعشاری، تأثیرگذار برای شرایط فیلترینگ دامنه مطالبات دارد. -
bool
- برای بار بولین، تأثیرگذار برای شرایط فیلترینگ مطابقت (در نسخه 1.4.0 به بعد در دسترس است). -
geo
- برای بار جغرافیایی، تأثیرگذار برای جعبه محدوده جغرافیایی و شرایط فیلترینگ شعاع جغرافیایی مطالبات دارد. -
text
- یک نوع نمایه ویژه مناسب برای بار کلیدی/رشته، تأثیرگذار برای شرایط فیلترینگ جستجوی متن کامل دارد.
نمایههای بار ممکن است حافظه اضافی مصرف کنند، بنابراین توصیه میشود تنها فیلدهای مورد استفاده در شرایط فیلترینگ را نمایه گذاری کنید. اگر نیاز به فیلترینگ بر اساس بسیاری از فیلدها دارید و محدودیتهای حافظه امکان نمایه گذاری همه آنها را نمیدهند، توصیه میشود فیلدهایی را انتخاب کنید که نتایج جستجو را حداکثر محدود میکنند. به طور کلی، هر چه مقدار منحصر به فرد بیشتری مقدار بار داشته باشد، استفادهی نمایه موثرتر خواهد بود.
نمایه متنکامل
از نگارش 0.10.0 در دسترس است
Qdrant پشتیبانی از جستجوی متنکامل برای بارهای رشتهای دارد. نمایه متنکامل به شما امکان میدهد نقاط را بر اساس حضور کلمات یا عبارات در فیلد بار فیلتر کنید.
پیکربندی یک نمایه متنکامل کمی پیچیده است زیرا میتوانید پارامترهای توکنبندی را مشخص کنید. توکنبندی فرآیند تقسیم یک رشته به توکنها و سپس نمایهگذاری این توکنها به یک نمایه معکوس است.
برای ایجاد یک نمایه متنکامل، میتوانید از روش زیر استفاده کنید:
PUT /collections/{collection_name}/index
{
"field_name": "نام فیلد برای نمایه گذاری",
"field_schema": {
"type": "text",
"tokenizer": "word",
"min_token_len": 2,
"max_token_len": 20,
"lowercase": true
}
}
روشهای توکنبندی در دسترس عبارتند از:
-
word
- رشته را بر اساس فاصله، نشانگرها و نویسههای خاص جدا میکند. -
whitespace
- رشته را بر اساس فاصله جدا میکند. -
prefix
- رشته را بر اساس فاصله، نشانگرها و نویسههای خاص جدا میکند، سپس برای هر کلمه یک نمایه پیشوند ایجاد میکند. به عنوان مثال،hello
به عنوانh
،he
،hel
،hell
،hello
نمایه گذاری میشود. -
multilingual
- یک نوع خاص توکنبندی بر اساس بسته charabia است. این امکان را برای توکنبندی صحیح و لماتیزاسیون چند زبانه، از جمله زبانهای دارای الفبای غیر لاتین و جداکنندههای غیر فضا فراهم میکند. برای یک فهرست کامل از زبانهای پشتیبانی شده و گزینههای نرمالسازی، به مستندات charabia مراجعه کنید. در پیکربندی ساختار پیشفرض، Qdrant حامی تمام زبانها نیست زیرا این موضوع باعث افزایش اندازه فایلهای دودویی خواهد شد. زبانهای چینی، ژاپنی و کرهای به طور پیشفرض فعال نیستند، اما میتوانند با ساخت Qdrant از کد منبع با استفاده از پرچمهای--features multiling-chinese, multiling-japanese, multiling-korean
فعال شوند.
لطفاً برای مثالهای مطابقت متنکامل به مثالهای مطابقت متنکامل مراجعه کنید.
فهرستبندی برداری
فهرستبندی برداری یک ساختار داده است که بر اساس بردارها ساخته شده و از مدلهای ریاضی خاصی استفاده میکند. با استفاده از فهرستبندی بردارها، میتوانیم به طور کارآمد به چندین بردار مشابه بردار هدف پرسوجو کنیم.
در حال حاضر، Qdrant تنها از HNSW به عنوان فهرست بردار استفاده میکند.
HNSW (Hierarchical Navigable Small World Graph) الگوریتم فهرستبندی مبتنی بر گراف است. بهطوری که بر اساس قوانین معین، یک ساختار ناوبری چندلایه برای گراف ایجاد میکند. در این ساختار، لایههای بالاتر با فاصله بیشتر بین گرهها پراکندهتر هستند. لایههای پایینتر نیز جمعتر با فواصل کوچکتر بین گرهها هستند. جستجو از لایه بالا آغاز شده و نزدیکترین گره به هدف در آن لایه پیدا شده و سپس برای جستجوی دیگر به لایه بعدی وارد میشود. پس از چندین تکرار، به سرعت به موقعیت هدف میرسد.
برای بهبود عملکرد، HNSW حداکثر درجه گرهها روی هر لایه از گراف را به m
محدود میکند. بهطور مکمل، میتوانید محدوده جستجو را با استفاده از ef_construct
(در هنگام ساخت فهرست) یا ef
(در هنگام جستجوی هدف) مشخص کنید.
این پارامترها میتوانند در فایل پیکربندی پیکربندی شوند:
storage:
hnsw_index:
m: 16
ef_construct: 100
full_scan_threshold: 10000
در فرآیند ایجاد مجموعه، پارامتر ef
قابل پیکربندی است و بهطور پیشفرض برابر با ef_construct
است.
از چند دلیل HNSW انتخاب شده است. اولا، HNSW با اجازه دادن به Qdrant برای اصلاح فیلترها در طول فرآیند جستجو، بسیار سازگار است. ثانیا، طبق تستهای کارایی عمومی، یکی از دقیقترین و سریعترین الگوریتمهاست.
در دسترس از نسخه v1.1.1
پارامترهای HNSW نیز میتوانند برای مجموعهها و بردارهای دارای نام، توسط تنظیم hnsw_config
بهینهسازی شوند.
فهرست بندی قابل فیلتر
جدا کردن فهرست بار و فهرست بردار به تنهایی نمیتواند به طور کامل به استفاده از فیلترها برای جستجو پاسخ دهد.
در صورتیکه فیلترها ضعیف باشند، میتوان از فهرست بردار HNSW به صورت مستقیم استفاده کرد. در مواردی که فیلترها سخت باشند، میتوان از فهرست بار استفاده کرده و به طور کامل دوباره امتیاز دهی کرد. با این حال، در موارد میانی، این رویکرد بیتاثیر است.
از یک سو، نمیتوانیم به یک تعداد زیادی بردارها را اسکن کامل کنیم. از سوی دیگر، در هنگام استفاده از فیلترهای بسیار سخت، گراف HNSW شروع به بر همشکنی میکند.
اضافه کردن یالهای اضافی به شما اجازه میدهد تا از فهرست بردار HNSW به طور کارآمد برای جستجوی بردارهای همسایه استفاده کرده و در هنگام جستجوی در گراف از فیلترها استفاده کنید.
این رویکرد به حداقل رساندن هزینههای چکهای شرایط، زیرا شما تنها باید شرایط را برای یک بخش کوچکی از نقاط شرکتکننده در جستجو محاسبه کنید.