İçindekiler
Qdrant'ın önemli bir özelliği, vektör indeksi ve geleneksel indeksin etkili bir şekilde birleşimidir. Bu, sadece bir vektör indeksine sahip olmanın, filtreleme koşulları altında verimli vektör aramasını mümkün kılmak için yeterli olmadığı için önemlidir. Basitçe söylemek gerekirse, vektör indeksi vektör aramasını hızlandırırken, yük indeksi filtrelemeyi hızlandırır.
Bir paragraftaki indeks bağımsız olarak var olur, ancak indeksin parametreleri kendisi için tüm set için yapılandırılmıştır.
Tüm paragrafların otomatik olarak indeksleri olmaz. Bu, optimizasyon ayarlarının gereksinimlerine bağlıdır ve genellikle depolanan nokta sayısına bağlıdır.
Yük İndeksi
Qdrant'taki yük indeksi, geleneksel bir belge odaklı veritabanındaki indekse benzer. Bu indeks, belirli alanlar ve tipler için oluşturulur ve ilgili filtre koşullarına göre hızlı bir şekilde noktaları almak için kullanılır.
Ayrıca, filtre koşullarının kardinalitesini doğru bir şekilde tahmin etmek için kullanılır, bu da sorgu planlayıcının arama stratejilerini seçmesine yardımcı olur.
Bir indeks oluşturmak ek hesaplama kaynakları ve bellek gerektirir, bu nedenle indekslenecek alanları dikkatlice seçmek önemlidir. Qdrant, bu seçimi sizin yerinize yapmaz, ancak kullanıcıya devreder.
Bir alanı indekslenebilir olarak işaretlemek için aşağıdaki yöntem kullanılabilir:
PUT /collections/{collection_name}/index
{
"field_name": "indekslenmesi gereken alanın adı",
"field_schema": "anahtar kelime"
}
Kullanılabilir alan tipleri şunlardır:
-
keyword
- Eşleşme filtre koşullarını etkileyen anahtar kelime yükü için. -
integer
- Eşleşme ve aralık filtre koşullarını etkileyen tamsayı yükü için. -
float
- Aralık filtre koşullarını etkileyen kayan nokta yükü için. -
bool
- Eşleşme filtre koşullarını etkileyen boolean yükü için (sürüm 1.4.0'dan itibaren mevcuttur). -
geo
- Coğrafi yük için, coğrafi sınırlayıcı kutu ve coğrafi yarıçap filtre koşullarını etkileyen. -
text
- Tam metin arama filtre koşulları için uygun olan özel bir indeks türü.
Yük indeksleri ek bellek tüketebilir, bu nedenle yalnızca filtre koşullarında kullanılan alanları indekslemeniz önerilir. Birçok alan üzerinden filtreleme yapmanız gerekiyorsa ve bellek kısıtlamaları tüm alanların indekslenmesine izin vermiyorsa, arama sonuçlarını en çok kısıtlayan alanları seçmeniz tavsiye edilir. Genellikle bir yük değerinin sahip olduğu benzersiz değerler ne kadar çoksa, indeks kullanımının o kadar etkili olacağı söylenebilir.
Tam Metin İndeksi
0.10.0 sürümünden itibaren mevcuttur
Qdrant, dize yükleri için tam metin aramasını destekler. Tam metin indeksi, yük alanındaki kelimelerin veya ifadelerin varlığına göre noktaları filtrelemenizi sağlar.
Tam metin indeksini yapılandırmak biraz karmaşıktır çünkü belirli bir tokenleştirme parametreleri belirtebilirsiniz. Tokenleştirme, bir dizedeki parçaları parçalama ve bu parçaları ters indekse işleme sürecidir.
Tam metin indeksi oluşturmak için aşağıdaki yöntemi kullanabilirsiniz:
PUT /collections/{collection_name}/index
{
"field_name": "indekslenecek alanın adı",
"field_schema": {
"type": "text",
"tokenizer": "word",
"min_token_len": 2,
"max_token_len": 20,
"lowercase": true
}
}
Kullanılabilir tokenleştirme yöntemleri şunlardır:
-
word
- Dizedeki boşluklar, noktalama işaretleri ve özel karakterlere göre ayrıştırma yapar. -
whitespace
- Dizedeki boşluklara göre ayrıştırma yapar. -
prefix
- Dizedeki boşluklar, noktalama işaretleri ve özel karakterlere göre ayrıştırma yapar, ardından her kelime için bir önek indeksi oluşturur. Örneğin,hello
şu şekilde indekslenir:h
,he
,hel
,hell
,hello
. -
multilingual
- charabia paketine dayalı özel bir tokenleştirme türüdür. Çoklu dil desteği, Latin olmayan alfabelere ve boşluk olmayan ayırıcılara sahip dilleri de içerir. Desteklenen dillerin tam listesi ve normalleştirme seçenekleri için charabia belgelerine bakın. Varsayılan yapılandırma içinde, qdrant tüm dilleri desteklemez çünkü bu, ikili dosyaların boyutunu artırır. Çince, Japonca ve Korece varsayılan olarak etkinleştirilmemiş olsa da,--features multiling-chinese, multiling-japanese, multiling-korean
bayraklarını kullanarak qdrant'ı kaynak kodundan derleyerek etkinleştirebilirsiniz.
Lütfen tam metin eşleşme örnekleri için tam metin indeksi kullanım örneklerine bakınız.
Vektör İndeksleme
Vektör indeksleme, belirli matematik modelleri aracılığıyla oluşturulan vektörlere dayalı bir veri yapısıdır. Vektör indeksleme ile hedef vektöre benzer çoklu vektörleri verimli bir şekilde sorgulayabiliriz.
Şu anda Qdrant sadece vektör indisi olarak HNSW'yi kullanmaktadır.
HNSW (Hiyerarşik Gezilebilir Küçük Dünya Grafik) bir grafik tabanlı indisleme algoritmasıdır. Belirli kurallara göre, grafik için çok katmanlı bir gezinme yapısı oluşturur. Bu yapıda, üst katmanlar daha seyrek olup düğümler arasında daha büyük mesafeler bulunur. Alt katmanlar ise daha yoğundur ve düğümler arasındaki mesafeler daha küçüktür. Arama işlemi üst katmandan başlar, o katmandaki hedefe en yakın düğümü bulur ve ardından başka bir arama için bir sonraki katmana girer. Birden fazla iterasyon sonrasında hedef konuma hızla yaklaşabilir.
Performans iyileştirmesi için HNSW, grafikteki her katmanın maksimum düğüm derecesini m
ile sınırlar. Ayrıca, ef_construct
(indis oluşturma sırasında) veya ef
(hedef aranırken) kullanarak arama aralığını belirleyebilirsiniz.
Bu parametreler yapılandırma dosyasında yapılandırılabilir:
storage:
hnsw_index:
m: 16
ef_construct: 100
full_scan_threshold: 10000
Koleksiyon oluşturma süreci sırasında ef
parametresi yapılandırılabilir ve varsayılan olarak ef_construct
değerine eşittir.
HNSW'nin tercih edilmesinin birkaç nedeni var. İlk olarak, HNSW, Qdrant'ın arama sürecinde filtreleri değiştirmesine olanak tanıyan bir şekilde yüksek uyumluluğa sahiptir. İkinci olarak, genel performans testlerine göre en doğru ve en hızlı algoritmalarından biridir.
V1.1.1'den itibaren kullanılabilir
HNSW parametreleri ayrıca, hnsw_config
ayarlanarak koleksiyonlar ve adlandırılmış vektörler için arama performansını optimize etmek üzere ayarlanabilir.
Filtrelenebilir İndeks
Ayrı yük dizinleri ve sadece vektör indisleri, filtrelerin arama için kullanımını tam olarak ele alamaz.
Filtrelerin zayıf olduğu durumlarda, doğrudan HNSW indisini kullanılabilir. Filtrelerin sıkı olduğu durumlarda ise yük dizini kullanılabilir ve tamamen yeniden puanlanabilir. Bununla birlikte, orta durumlarda, bu yaklaşım etkisizdir.
Bir yandan, çok fazla vektörde tam tarama yapamayız. Diğer yandan, çok sıkı filtreler kullanırken HNSW grafiği bozmaya başlar.
Ek kenarlar, HNSW indisini etkin bir şekilde kullanmanızı sağlar ve grafikte arama yaparken filtreleri uygular. Bu yaklaşım, koşul kontrollerinin üstesinden gelmenin üstesinden gelir, çünkü sadece arama sürecine katılan noktaların küçük bir kısmı için koşulları hesaplamanız gerekir.