Hybridsuche: Kombination von Volltext- und ELSER-Ergebnissen

Wie schon bei der Vektorsuche im vorherigen Abschnitt lernen Sie in diesem Abschnitt, wie Sie die besten Suchergebnisse aus Volltext- und semantischen Abfragen mithilfe des Reciprocal Rank Fusion- Algorithmus kombinieren können.

Einführung in Teilsuchen

Die Lösung zur Implementierung einer hybriden Volltext- und dichten Vektorsuche bestand darin, eine Suchanfrage zu senden, die die Argumente query und knn enthielt, um die beiden Suchen anzufordern, sowie das Argument rrf , um sie zu einer einzigen Ergebnisliste zu kombinieren.

Die Komplikation, die sich beim Versuch ergibt, dasselbe zu tun, um Volltext- und Sparse-Vektor-Suchanfragen zu kombinieren, besteht darin, dass beide das Argument query verwenden. Um die beiden Anfragen, die mit dem RRF-Algorithmus kombiniert werden müssen, bereitstellen zu können, ist es notwendig, zwei query -Argumente einzubeziehen. Die Lösung hierfür ist die Verwendung von Teilsuchen.

Die Untersuche ist eine Funktion, die sich derzeit in der technischen Vorschauphase befindet. Aus diesem Grund wird dies vom Python Elasticsearch-Client nicht nativ unterstützt. Um diese Einschränkung zu umgehen, kann die Methode search() der Klasse Search so geändert werden, dass die Suchanfrage mit dem Argument body gesendet wird. Im Folgenden sehen Sie eine neue, aber ähnliche Implementierung, die das body -Argument des Clients verwendet, um eine Suchanfrage zu senden:

Diese Implementierung erfordert keine Änderungen an der Anwendung, da sie funktional gleichwertig ist. Der einzige Unterschied besteht darin, dass die Methode search() alle Argumente validiert, bevor die Anfrage gesendet wird; die Methode body ist die einzige Ausnahme. Der Server validiert Anfragen immer, unabhängig davon, wie der Client sie sendet.

Mit dieser Version kann das Argument sub_searches in Search.search() verwendet werden, um mehrere Suchanfragen wie folgt zu senden:

Implementierung der Hybridsuche

Zum Abschluss dieses Abschnitts greifen wir nun auf die Volltextlogik zurück und kombinieren sie mit der semantischen Suchanfrage, die bereits früher in diesem Kapitel vorgestellt wurde.

Nachfolgend sehen Sie den aktualisierten handle_search() -Endpunkt:

Wie Sie sich erinnern, suchte die Funktion extract_filters() nach Kategoriefiltern, die der Benutzer in der Suchabfrage eingegeben hatte, und gab den verbleibenden Teil als parsed_query zurück. Wenn parsed_query leer ist, bedeutet dies, dass der Benutzer nur einen Kategoriefilter eingibt. In diesem Fall sollte die Abfrage ein einfaches match_all mit der ausgewählten Kategorie als Filter sein. Dies wird im else -Teil der großen Bedingung implementiert.

Bei einer Suchanfrage wird die Option sub_searches wie im vorherigen Abschnitt gezeigt verwendet, um die Suchanfragen multi_match und text_expansion einzuschließen. Mit der Option rank wird angefordert, dass die Ergebnisse der beiden Teilsuchen zu einer einzigen Rangliste von Ergebnissen kombiniert werden. Um die Abfrage zu vervollständigen, werden die Argumente size und from_ bereitgestellt, um die Unterstützung für die Paginierung aufrechtzuerhalten.

Klicken Sie hier , um diese Version der Anwendung anzusehen.

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