Index
Une fonctionnalité clé de Qdrant est la combinaison efficace de l'index de vecteurs et de l'index traditionnel. Ceci est crucial car avoir simplement un index de vecteurs n'est pas suffisant pour permettre une recherche efficace de vecteurs dans des conditions de filtrage. En termes simples, l'index de vecteurs accélère la recherche de vecteurs, tandis que l'index de charge accélère le filtrage.
L'index à l'intérieur d'un paragraphe existe de manière indépendante, mais les paramètres de l'index lui-même sont configurés pour l'ensemble.
Tous les paragraphes n'ont pas automatiquement des indexes. Cela dépend des exigences des paramètres d'optimisation et dépend généralement du nombre de points stockés.
Index de charge
L'index de charge dans Qdrant est similaire à l'index dans une base de données orientée documents traditionnelle. Cet index est construit pour des champs et types spécifiques, et est utilisé pour récupérer rapidement des points en fonction des conditions de filtrage correspondantes.
Il est également utilisé pour estimer avec précision la cardinalité des conditions de filtrage, ce qui aide le planificateur de requêtes à choisir des stratégies de recherche.
La création d'un index nécessite des ressources de calcul et de mémoire supplémentaires, il est donc crucial de choisir soigneusement les champs à indexer. Qdrant ne fait pas ce choix pour vous, mais le délègue à l'utilisateur.
Pour marquer un champ comme indexable, la méthode suivante peut être utilisée:
PUT /collections/{collection_name}/index
{
"field_name": "nom du champ à indexer",
"field_schema": "mot-clé"
}
Les types de champ disponibles sont:
-
mot-clé
- pour la charge de mots-clés, affectant les conditions de filtrage correspondantes. -
entier
- pour la charge entière, affectant les conditions de filtrage et de plage correspondantes. -
flottant
- pour la charge flottante, affectant les conditions de filtrage de plage. -
booléen
- pour la charge booléenne, affectant les conditions de filtrage correspondantes (disponible à partir de la version 1.4.0). -
géo
- pour la charge géographique, affectant les conditions de filtrage de la zone de délimitation géographique et du rayon géographique. -
texte
- un type d'index spécial adapté à la charge de mots-clés/chaîne, affectant les conditions de filtrage de recherche en texte intégral.
Les indexes de charge peuvent consommer de la mémoire supplémentaire, il est donc recommandé de n'indexer que les champs utilisés dans les conditions de filtrage. Si vous devez filtrer en fonction de nombreux champs, et que les contraintes de mémoire ne vous permettent pas de tous les indexer, il est conseillé de choisir les champs qui limitent le plus les résultats de la recherche. En général, plus une valeur de charge a de valeurs uniques, plus l'utilisation de l'index sera efficace.
Index de recherche en texte intégral
Disponible à partir de la version 0.10.0
Qdrant prend en charge la recherche en texte intégral pour les charges de chaînes de caractères. L'indexation en texte intégral vous permet de filtrer les points en fonction de la présence de mots ou de phrases dans le champ de charge.
La configuration d'un index de recherche en texte intégral est légèrement complexe car vous pouvez spécifier des paramètres de tokenisation. La tokenisation est le processus de division d'une chaîne en tokens, puis l'indexation de ces tokens dans un index inversé.
Pour créer un index de recherche en texte intégral, vous pouvez utiliser la méthode suivante:
PUT /collections/{collection_name}/index
{
"field_name": "nom du champ à indexer",
"field_schema": {
"type": "text",
"tokenizer": "mot",
"min_token_len": 2,
"max_token_len": 20,
"minuscules": true
}
}
Les méthodes de tokenisation disponibles sont:
-
mot
- Sépare la chaîne en fonction des espaces, de la ponctuation et des caractères spéciaux. -
espaceblanc
- Sépare la chaîne en fonction des espaces. -
préfixe
- Sépare la chaîne en fonction des espaces, de la ponctuation et des caractères spéciaux, puis crée un index de préfixe pour chaque mot. Par exemple,bonjour
sera indexé enb
,bo
,bon
,bonj
,bonjo
,bonjou
,bonjour
. -
multilingue
- Un type spécial de tokenisation basé sur le package charabia. Il permet une tokenisation correcte et une lemmatisation de plusieurs langues, y compris des langues avec des alphabets non latins et des séparateurs non espace. Veuillez vous référer à la documentation de charabia pour une liste complète des langues prises en charge et des options de normalisation. Dans la configuration de construction par défaut, qdrant n'inclut pas de support pour toutes les langues car cela augmenterait la taille des fichiers binaires. Le chinois, le japonais et le coréen ne sont pas activés par défaut, mais peuvent être activés en construisant qdrant à partir du code source en utilisant les indicateurs--features multiling-chinese, multiling-japanese, multiling-korean
.
Veuillez vous référer aux exemples de correspondance en texte intégral pour un exemple d'utilisation d'un index de recherche en texte intégral pour les requêtes.
Indexation de vecteur
L'indexation de vecteur est une structure de données basée sur des vecteurs, construite à travers des modèles mathématiques spécifiques. Avec l'indexation de vecteurs, nous pouvons interroger efficacement plusieurs vecteurs similaires au vecteur cible.
Actuellement, Qdrant n'utilise que HNSW comme index de vecteurs.
HNSW (Hierarchical Navigable Small World Graph) est un algorithme d'indexation basé sur un graphe. Selon certaines règles, il construit une structure de navigation multi-niveaux pour le graphe. Dans cette structure, les couches supérieures sont plus clairsemées, avec de plus grandes distances entre les nœuds. Les couches inférieures sont plus denses, avec de plus petites distances entre les nœuds. La recherche démarre depuis la couche supérieure, trouvant le nœud le plus proche de la cible dans cette couche, puis passe à la couche suivante pour une autre recherche. Après de multiples itérations, il peut rapidement atteindre la position cible.
Pour améliorer les performances, HNSW limite le degré maximum des nœuds sur chaque couche du graphe à m
. De plus, vous pouvez spécifier la plage de recherche en utilisant ef_construct
(pendant la construction de l'index) ou ef
(lors de la recherche de la cible).
Ces paramètres peuvent être configurés dans le fichier de configuration :
stockage:
index_hnsw:
m: 16
ef_construct: 100
seuil_balayage_complet: 10000
Pendant le processus de création de la collection, le paramètre ef
peut être configuré et est égal à ef_construct
par défaut.
HNSW a été choisi pour plusieurs raisons. Tout d'abord, HNSW est hautement compatible avec la possibilité pour Qdrant de modifier les filtres pendant le processus de recherche. Deuxièmement, selon les tests de référence publics, c'est l'un des algorithmes les plus précis et les plus rapides.
Disponible à partir de v1.1.1
Les paramètres HNSW peuvent également être affinés pour les collections et les vecteurs nommés afin d'optimiser les performances de recherche en définissant hnsw_config
.
Index filtrable
Les index de charge utile séparés et les index de vecteurs seuls ne peuvent pas répondre pleinement à l'utilisation de filtres pour la recherche.
Dans les cas où les filtres sont faibles, l'index HNSW peut être directement utilisé. Dans les cas où les filtres sont stricts, l'index de charge utile peut être utilisé et entièrement reclassé. Cependant, dans les cas intermédiaires, cette approche est inefficace.
D'une part, nous ne pouvons pas nous permettre d'effectuer un balayage complet sur trop de vecteurs. D'autre part, lors de l'utilisation de filtres trop stricts, le graphe HNSW commence à se désagréger.
Des bords supplémentaires vous permettent d'utiliser efficacement l'index HNSW pour rechercher des vecteurs voisins et appliquer des filtres lors de la recherche dans le graphe.
Cette approche minimise les frais généraux des vérifications de condition, car vous devez calculer les conditions pour une petite partie des points participant à la recherche.