L'algorithme k-nearest neighbor (kNN) effectue une recherche de similarité sur des champs de type dense_vector. Ce type de recherche, plus justement appelé "approximate kNN", accepte un vecteur ou une intégration comme terme de recherche et trouve dans l'index les entrées qui en sont proches.
Dans cette section, vous allez apprendre à effectuer une recherche kNN à l'aide des documents intégrés créés dans la section précédente.
La requête
Dans la section du tutoriel consacrée à la recherche en texte intégral, vous avez appris à connaître l'option de requête transmise à la méthode search() du client Elasticsearch. Lors de la recherche de vecteurs, l'option knn est utilisée à la place.
Vous pouvez voir ci-dessous une nouvelle version de la fonction handle_search() dans app.py qui exécute une recherche kNN pour la requête saisie par l'utilisateur dans le formulaire de recherche.
Dans cette version de la fonction, l'option query a été remplacée par knn. Les options size et from_ pour la pagination restent les mêmes, et tout le reste de la fonction et du modèle index.html est également identique.
L'option de recherche knn accepte un certain nombre de paramètres qui configurent la recherche :
field: le champ de l'index à rechercher. Le champ doit être de typedense_vector.query_vector: l'intégration à rechercher. Il doit s'agir d'une intégration générée à partir du texte de recherche.num_candidates: le nombre de documents candidats à prendre en compte dans chaque tesson. Elasticsearch récupère ce nombre de candidats à partir de chaque groupe, les combine en une seule liste, puis trouve les "k" les plus proches à renvoyer en tant que résultats.k: le nombre de résultats à renvoyer. Ce nombre a un effet direct sur les performances, il doit donc être le plus petit possible. La valeur transmise dans cette option doit être inférieure ànum_candidates.
Avec les paramètres utilisés dans le code ci-dessus, les 10 meilleurs résultats seront renvoyés.
Nous vous invitons à expérimenter cette nouvelle version de l'application. Voici deux exemples qui permettent d'apprécier l'utilité de ce type de recherche :
- En recherchant "holiday", qui est l'équivalent en anglais britannique de "vacation" en anglais américain, la recherche kNN renvoie le document "Vacation Policy" comme premier résultat, même si le mot holiday lui-même n'apparaît pas dans le document.
- En recherchant "cats and dogs" ou tout autre terme relatif aux animaux de compagnie, le document "Office Pet Policy" apparaît en tête des résultats, même si le résumé du document ne mentionne aucun animal de compagnie en particulier.
Utilisation de filtres dans les requêtes kNN
La requête de recherche, telle qu'elle est définie dans la section "texte intégral" de ce tutoriel, permet à l'utilisateur de demander l'utilisation d'une catégorie spécifique, en utilisant la syntaxe category:<category-name> à n'importe quel endroit du texte de recherche. La fonction extract_filters() dans app.py est chargée de trouver et de séparer ces expressions de filtre de la requête de recherche. Dans la version de la fonction handle_search() de la section précédente, la variable filters n'est pas utilisée, de sorte que les filtres de catégorie sont ignorés.
Heureusement, l'option knn permet également le filtrage. L'option filtre accepte en fait le même type de filtres, de sorte que les filtres peuvent être insérés directement dans la requête knn, exactement comme ils sont renvoyés par la fonction extract_filters():
Les agrégations fonctionnent également bien dans les requêtes kNN, et peuvent donc être ajoutées :
Cette version de la fonction handle_search() a les mêmes fonctionnalités que la version de recherche en texte intégral, mais elle utilise la recherche vectorielle au lieu de la recherche par mot-clé.
Dans la section suivante, vous apprendrez à combiner les résultats de ces deux méthodes de recherche.
Précédemment
Stockage des emboîtementsSuivant
Recherche hybride