k-Nächste-Nachbarn (kNN)-Suche

Der k-nächste-Nachbarn-Algorithmus (kNN) führt eine Ähnlichkeitssuche auf Feldern vom Typ dense_vector durch. Diese Art der Suche, die treffender als „approximatives kNN“ bezeichnet wird, akzeptiert einen Vektor oder eine Einbettung als Suchbegriff und findet Einträge im Index, die nahe beieinander liegen.

In diesem Abschnitt lernen Sie, wie Sie eine kNN-Suche mit den im vorherigen Abschnitt erstellten Dokumenteneinbettungen durchführen.

Die

Im Abschnitt zur Volltextsuche des Tutorials haben Sie die Abfrageoption kennengelernt, die an die search() -Methode des Elasticsearch-Clients übergeben wird. Bei der Suche nach Vektoren wird stattdessen die kNN- Option verwendet.

Nachfolgend sehen Sie eine neue Version der Funktion handle_search() in app.py , die eine kNN-Suche für die vom Benutzer im Suchformular eingegebene Anfrage durchführt.

In dieser Version der Funktion wurde die Option query durch knn ersetzt. Die Optionen size und from_ für die Paginierung bleiben unverändert, und auch alles andere in der Funktion und der index.html- Vorlage ist unverändert.

Die Suchoption knn akzeptiert eine Reihe von Parametern, die die Suche konfigurieren:

  • field: das Feld im Index, das durchsucht werden soll. Das Feld muss vom Typ dense_vector sein.
  • query_vector: die zu suchende Einbettung. Dies sollte eine aus dem Suchtext generierte Einbettung sein.
  • num_candidates: die Anzahl der zu berücksichtigenden Kandidatendokumente aus jedem Shard. Elasticsearch ruft diese Anzahl an Kandidaten von jedem Shard ab, kombiniert sie zu einer einzigen Liste und sucht dann den nächstgelegenen "k", der als Ergebnis zurückgegeben wird.
  • kDie Anzahl der zurückzugebenden Ergebnisse. Diese Zahl hat einen direkten Einfluss auf die Leistung, daher sollte sie so klein wie möglich gehalten werden. Der in dieser Option übergebene Wert muss kleiner als num_candidates sein.

Mit den im obigen Code verwendeten Einstellungen werden die 10 besten übereinstimmenden Ergebnisse zurückgegeben.

Sie können gerne mit dieser neuen Version der Anwendung experimentieren. Hier sind zwei gute Beispiele, um zu verdeutlichen, wie nützlich diese Art der Suche ist:

  • Bei der Suche nach „holiday“, dem britischen Äquivalent zu „vacation“ im amerikanischen Englisch, liefert die kNN-Suche das Dokument „Vacation Policy“ als erstes Ergebnis, obwohl das Wort „holiday“ selbst nicht in dem Dokument vorkommt.
  • Bei der Suche nach „Katzen und Hunden“ oder anderen Begriffen im Zusammenhang mit Haustieren erscheint das Dokument „Büro-Haustierrichtlinie“ als erstes Ergebnis, obwohl in der Zusammenfassung des Dokuments keine spezifischen Haustiere erwähnt werden.

Verwendung von Filtern in kNN-Abfragen

Die Suchanfrage, wie sie im Volltextteil dieses Tutorials definiert ist, ermöglichte es dem Benutzer, die Verwendung einer bestimmten Kategorie anzufordern, indem er die Syntax category:<category-name> an beliebiger Stelle im Suchtext verwendete. Die Funktion extract_filters() in app.py ist dafür zuständig, diese Filterausdrücke aus der Suchanfrage zu finden und zu trennen. In der Version der handle_search() -Funktion aus dem vorherigen Abschnitt wird die Variable filters nicht verwendet, daher werden die Kategoriefilter ignoriert.

Zum Glück unterstützt die Option knn auch das Filtern. Die Filteroption akzeptiert tatsächlich die gleichen Filtertypen, sodass die Filter direkt in die knn -Abfrage eingefügt werden können, genau so, wie sie von der extract_filters() -Funktion zurückgegeben werden:

Aggregationen funktionieren auch gut in kNN-Abfragen, daher können sie auch wieder hinzugefügt werden:

Diese Version der handle_search() -Funktion bietet die gleiche Funktionalität wie die Volltextsuche-Version, implementiert durch Vektorsuche anstelle einer schlüsselwortbasierten Suche.

Im nächsten Abschnitt erfahren Sie, wie Sie die Ergebnisse dieser beiden verschiedenen Suchmethoden kombinieren können.

Sind Sie bereit, hochmoderne Sucherlebnisse zu schaffen?

Eine ausreichend fortgeschrittene Suche kann nicht durch die Bemühungen einer einzelnen Person erreicht werden. Elasticsearch wird von Datenwissenschaftlern, ML-Ops-Experten, Ingenieuren und vielen anderen unterstützt, die genauso leidenschaftlich an der Suche interessiert sind wie Sie. Lasst uns in Kontakt treten und zusammenarbeiten, um das magische Sucherlebnis zu schaffen, das Ihnen die gewünschten Ergebnisse liefert.

Probieren Sie es selbst aus