Indice
Una delle caratteristiche principali di Qdrant è la combinazione efficace dell'indice vettoriale e dell'indice tradizionale. Questo è cruciale perché avere semplicemente un indice vettoriale non è sufficiente per consentire una ricerca vettoriale efficiente sotto condizioni di filtraggio. In termini semplici, l'indice vettoriale accelera la ricerca vettoriale, mentre l'indice del payload accelera il filtraggio.
L'indice all'interno di un paragrafo esiste indipendentemente, ma i parametri dell'indice stesso sono configurati per l'intero set.
Non tutti i paragrafi hanno automaticamente degli indici. Questo dipende dai requisiti delle impostazioni di ottimizzazione e di solito dipende dal numero di punti memorizzati.
Indice del Payload
L'indice del payload in Qdrant è simile all'indice in un database orientato ai documenti tradizionale. Questo indice è costruito per campi e tipi specifici, utilizzati per recuperare rapidamente dei punti basati sulle condizioni di filtro corrispondenti.
È inoltre utilizzato per stimare accuratamente la cardinalità delle condizioni di filtro, il che aiuta il pianificatore delle query a scegliere le strategie di ricerca.
Creare un indice richiede risorse computazionali e di memoria aggiuntive, quindi è fondamentale scegliere attentamente i campi da indicizzare. Qdrant non fa questa scelta per te, ma la delega all'utente.
Per contrassegnare un campo come indicizzabile, può essere utilizzato il seguente metodo:
PUT /collections/{collection_name}/index
{
"field_name": "nome del campo da indicizzare",
"field_schema": "keyword"
}
I tipi di campo disponibili sono:
-
keyword
- per payload di parole chiave, influenzando le condizioni di filtraggio corrispondenti. -
integer
- per payload di interi, influenzando le condizioni di corrispondenza e di intervallo. -
float
- per payload di numeri decimali, influenzando le condizioni di intervallo. -
bool
- per payload booleano, influenzando le condizioni di filtraggio corrispondenti (disponibile dalla versione 1.4.0 in poi). -
geo
- per payload geografico, influenzando le condizioni di filtro della bounding box geografica e del raggio geografico. -
text
- un tipo di indice speciale adatto per payload di parole chiave/stringa, influenzando le condizioni di ricerca full-text.
Gli indici del payload possono consumare memoria aggiuntiva, quindi si consiglia di indicizzare solo i campi utilizzati nelle condizioni di filtraggio. Se è necessario filtrare in base a molti campi, e vincoli di memoria non consentono di indicizzare tutti loro, è consigliabile scegliere i campi che limitano di più i risultati della ricerca. In generale, più valori unici ha un payload, più efficace sarà l'uso dell'indice.
Indice Full-text
Disponibile dalla versione 0.10.0
Qdrant supporta la ricerca full-text per payload di stringhe. L'indice full-text consente di filtrare i punti in base alla presenza di parole o frasi nel campo del payload.
La configurazione di un indice full-text è leggermente complessa perché è possibile specificare i parametri di tokenizzazione. La tokenizzazione è il processo di suddivisione di una stringa in token e quindi l'indicizzazione di questi token in un indice invertito.
Per creare un indice full-text, è possibile utilizzare il seguente metodo:
PUT /collections/{collection_name}/index
{
"field_name": "nome del campo da indicizzare",
"field_schema": {
"type": "text",
"tokenizer": "word",
"min_token_len": 2,
"max_token_len": 20,
"lowercase": true
}
}
I metodi di tokenizzazione disponibili sono:
-
word
- Separa la stringa in base agli spazi, alla punteggiatura e ai caratteri speciali. -
whitespace
- Separa la stringa in base agli spazi. -
prefix
- Separa la stringa in base agli spazi, alla punteggiatura e ai caratteri speciali, quindi crea un indice prefix per ogni parola. Ad esempio,ciao
verrà indicizzato comec
,ci
,cia
,ciao
. -
multilingual
- Un tipo speciale di tokenizzazione basato sul pacchetto charabia. Consente la corretta tokenizzazione e lemmatizzazione di più lingue, comprese le lingue con alfabeti non latini e separatori non spaziali. Fare riferimento alla documentazione di charabia per un elenco completo delle lingue supportate e delle opzioni di normalizzazione. Nella configurazione predefinita, qdrant non include il supporto per tutte le lingue in quanto aumenterebbe le dimensioni dei file binari. Il cinese, il giapponese e il coreano non sono abilitati per impostazione predefinita, ma possono essere abilitati compilando qdrant dal codice sorgente utilizzando i flag--features multiling-chinese, multiling-japanese, multiling-korean
.
Si prega di fare riferimento agli esempi di corrispondenza full-text per un esempio di utilizzo di un indice full-text per le query.
Indicizzazione vettoriale
L'indicizzazione vettoriale è una struttura dati basata su vettori, costruita attraverso specifici modelli matematici. Con l'indicizzazione vettoriale, possiamo interrogare efficientemente più vettori simili al vettore di destinazione.
Attualmente, Qdrant utilizza solo HNSW come indice vettoriale.
HNSW (Hierarchical Navigable Small World Graph) è un algoritmo di indicizzazione basato su grafo. Secondo determinate regole, costruisce una struttura di navigazione a più strati per il grafo. In questa struttura, i livelli superiori sono più sparsi, con distanze maggiori tra i nodi. I livelli inferiori sono più densi, con distanze più piccole tra i nodi. La ricerca inizia dal livello superiore, cercando il nodo più vicino al bersaglio in quel livello, per poi passare al livello successivo per un'altra ricerca. Dopo molteplici iterazioni, può avvicinarsi rapidamente alla posizione del bersaglio.
Per migliorare le prestazioni, HNSW limita il grado massimo dei nodi su ciascun livello del grafo a m
. Inoltre, è possibile specificare l'intervallo di ricerca utilizzando ef_construct
(durante la costruzione dell'indice) o ef
(durante la ricerca del bersaglio).
Questi parametri possono essere configurati nel file di configurazione:
storage:
hnsw_index:
m: 16
ef_construct: 100
full_scan_threshold: 10000
Durante il processo di creazione della raccolta, il parametro ef
può essere configurato ed è inizialmente uguale a ef_construct
.
HNSW è stato scelto per diverse ragioni. In primo luogo, HNSW è altamente compatibile con Qdrant, consentendo la modifica dei filtri durante il processo di ricerca. In secondo luogo, secondo i test di benchmark pubblici, è uno degli algoritmi più accurati e veloci.
Disponibile dalla versione 1.1.1
I parametri HNSW possono anche essere ottimizzati per raccolte e vettori nominati per ottimizzare le prestazioni di ricerca impostando hnsw_config
.
Indice filtrabile
Gli indici dei payload separati e gli indici vettoriali da soli non possono affrontare appieno l'uso di filtri per la ricerca.
Nei casi in cui i filtri sono deboli, l'indice HNSW può essere utilizzato direttamente. Nei casi in cui i filtri sono rigorosi, può essere utilizzato l'indice payload e riclassificato completamente. Tuttavia, nei casi intermedi, questo approccio non è efficace.
Da un lato, non possiamo permetterci di eseguire una scansione completa su troppi vettori. D'altro canto, quando si utilizzano filtri eccessivamente rigorosi, il grafo HNSW inizia a cedere.
Gli edge aggiuntivi consentono di utilizzare efficiently l'indice HNSW per cercare vettori adiacenti e applicare filtri durante la ricerca nel grafo.
Questo approccio riduce al minimo l'onere dei controlli di condizione, poiché è necessario calcolare le condizioni solo per una piccola parte dei punti che partecipano alla ricerca.