Search Evolution - Wie kaufe ich ein Klavier mit drei Klicks?

    Zuvor konnte Avito mithilfe der Keyword-Filterung oder der Navigation durch den Kategoriebaum das richtige Produkt finden. Diese Methode war zwar bekannt, aber nicht immer bequem - um ein Produkt oder eine Dienstleistung zu finden, mussten Sie viele Klicks machen. Vor mehr als einem Jahr hatten wir eine Relevanz, dank derer die Suche besser wurde. Jetzt ist es einfacher und bequemer, ein Produkt oder eine Dienstleistung auch auf der Hauptseite zu finden. Mit dieser Innovation fallen ungeeignete, offen "Junk" -Güter nicht mehr in die Ausgabe. Und dies ist nur einer der Schritte, um die Suche zu verbessern. Wir verändern die Infrastruktur schrittweise, sodass wir die Qualität der Suche intensiver bearbeiten, sie schneller verbessern und neue Funktionen einführen können, von denen Verkäufer und Käufer bei Avito profitieren.


    In dem Artikel werde ich Ihnen sagen, wie sich die Suche bei Avito verändert hat: wie wir angefangen haben und wie wir uns jetzt auf das Verbessern des Lebens unserer Benutzer hinbewegen, indem wir unsere Innovationen sowohl im Produkt als auch im Füllmaterial teilen - im technischen Teil. Sehr hardcore Fleisch wird nicht hier sein, aber ich hoffe, es gefällt euch.



    Einige einführende Informationen: Avito ist der beliebteste Anzeigenservice in Russland. Wir haben täglich mehr als 450.000 Anzeigen geschaltet und die Anzahl der Besucher pro Monat liegt bei 35 Millionen, was täglich mehr als 140 Millionen Suchanfragen verursacht.


    Typisches Suchskript vor


    Stellen Sie sich ein einfaches Beispiel vor, wie die Suche vor über einem Jahr funktioniert hat. Angenommen, Sie brauchen ein Klavier (warum nicht?). Wir gehen zur Hauptseite, wir geben "Klavier" ein.



    Bei der Ausgabe werden Sie höchstwahrscheinlich Movers, Pianoservices oder ähnliches erhalten, aber kein Musikinstrument.



    Dies geschieht, weil wir nach Datum der Platzierung sortieren werden - und diese Dienste meistens platziert werden.



    Um das Klavier zu sehen, müssen Sie die Kategorie präzisieren. Klicken Sie auf den Rubrator "Hobbies und Erholung", gehen Sie den Kategoriebaum zu "Musikinstrumente" und dann "Tasteninstrumente".




    Und erst danach sehen wir das Klavier, nach dem wir gesucht haben.



    Es stellte sich heraus, dass es die folgenden Funktionen gab, um die richtige Anzeige zu finden:


    • Verfeinerung der Kategorie bei der Suche nach Schlüsselwörtern,
    • Sortierung nach Frische und Preis,
    • Filter,
    • Suche nur nach Name

    Was hat sich aufgrund der Relevanz geändert?


    Aufgrund der Relevanz der Anzeigenausgabe fallen nicht mehr an, die nicht passen. Wenn Sie auf der Hauptseite nach einem Klavier suchen, werden Sie wahrscheinlich nicht die Dienste von Trägern sehen, die ihm beim Transport helfen, aber Sie sehen sofort das gewünschte Musikinstrument. Zur gleichen Zeit wurde eine neue Sortierung hinzugefügt - "Default". Es besteht aus zwei Indikatoren: der Relevanz der Anzeigentextabfrage und der Aktualität.



    Oben sehen Sie das aktuellste der relevanten.



    Bei Avito können Sie gegen eine zusätzliche Gebühr Ihre Anzeige erhöhen. Und mit der Einführung von Relevanz erhöht die Arbeit die Arbeit effizienter. Sie funktionieren vor allem dann, wenn Ihre Anzeige für eine Textabfrage relevant ist.


    Die Einführung von Relevanz bedeutet nicht, dass wir den Übergang zum Kategoriebaum vollständig aufgegeben haben. Nur in den meisten Fällen haben wir bei der Suche auf der Hauptseite die Anzahl der Klicks auf die gewünschte Anzeige reduziert. Wenn Sie immer noch einen Transportdienst benötigen, obwohl Sie gerade ein "Klavier" in die Suche eingegeben haben, gehen Sie zum Kategoriebaum und Sie finden diese Anzeigen. Die Suche begann auch effizienter und innerhalb der Kategorie, zum Beispiel "persönliche Dinge" und "Haushaltsgeräte".


    So finden Sie mit drei Klicks das richtige Produkt


    Die Suche wird für Benutzer nicht nur aufgrund der Qualität des Problems einfacher. Es gibt andere Möglichkeiten, es zu verbessern. Einer von ihnen - in die Kategorie werfen. Wir suchen zum Beispiel nach Lamborghini Gaardo (ja, Sie spielen gerne Klavier und möchten mit dem Lamborghini fahren). Um zur Fahrzeugkategorie eines bestimmten Modells zu gelangen, müssen Sie zwei zusätzliche Klicks machen. Mit Relevanz erhalten Sie höchstwahrscheinlich, was Sie wollen.



    Es gibt aber noch eine weitere Möglichkeit, dass Sie sofort Autos einschicken. Das Problem wird eingegrenzt, das gewünschte Auto wird in den Filtern ausgewählt und Sie erhalten wirklich Autos in der Ausgabe.




    Eine andere Möglichkeit besteht darin, Tags zu erweitern. Wenn Sie beispielsweise das Wort "Jacke" eingeben, haben Sie Hinweise.



    Der Screenshot oben zeigt die Tipps: Die Art der Jacken - Frauen, Männer, Mädchen, Jungen. Wenn Sie auf "Für Mädchen" klicken, gelangen Sie sofort in die Kategorie, in der die entsprechenden Filter ausgewählt werden. Es wird auch eine Reihe zusätzlicher Erweiterungs-Tags geben: Winterjacke, Leder, Neu und so weiter. Wenn Sie den Kategoriebaum manuell zum richtigen Produkt wechseln, müssen Sie weitere Aktionen ausführen.



    Was ist der Unterschied zwischen Suchen und Filtern?


    Bei einem Vortrag auf der RIT ++ hatten die Zuhörer eine Frage: Was ist der Unterschied zwischen Textsuche und Filtern? Alles ist ganz einfach. Sie können die richtige Anzeige ohne Textanfrage finden, indem Sie den Kategoriebaum aufrufen. In diesem Fall werden bei der Suche immer noch Produkte und Dienstleistungen gefunden, jedoch nicht anhand des angegebenen Textes, sondern anhand einer Reihe von Parametern, die von den entsprechenden Filtern der ausgewählten Kategorie übertragen werden.


    Jede Kategorie verfügt über einen eigenen Filtersatz. In der Kategorie "Autos" gibt es beispielsweise einige Filter, in der Kategorie "persönliche Gegenstände" - andere Filter. Das heißt, die Filter sind starr an die Kategorie gebunden.


    Anzeigen in zwei Minuten schalten


    Für Verkäufer gab es eine wichtige Neuerung, die sie beim Einreichen ihrer Anzeigen empfinden. Wenn Ihre Anzeige kein "verboten" enthält oder kein Duplikat ist - die übliche gute Anzeige -, werden Sie sie fast sofort in der Ausgabe sehen. In der Realität dauert diese Verzögerung etwa zwei Minuten, in seltenen Fällen kann sie jedoch bis zu 30 Minuten verlängert werden. Bisher wurde die Ankündigung immer eine halbe Stunde später auf der Website angezeigt.


    Avito-Helfer


    Avito Helper ist eine Erweiterung für Chrome, die den Preis eines ähnlichen Produkts in Avito auf Websites von Drittanbietern anzeigt. In der Erweiterung können Sie die Preise in vielen Online-Shops mit den Preisen für Avito vergleichen oder einfach in unserem Service nach den erforderlichen Waren und Dienstleistungen suchen, ohne direkt zur Website oder zur Anwendung zu gelangen. Wir konnten den „Assistenten“ auch durch neue Infrastrukturänderungen implementieren.



    Architektur


    Wir haben Monolithen gesehen


    In Avito gibt es einen PHP-Monolith. Vor einem Jahr befand sich die gesamte Suchfunktion, die in Avito funktioniert, in diesem Monolith. Die Monolithensuche funktionierte mit vier Plattformen: Android, iOS, mobile Version im Browser und Desktop. Um die Ausgabe zu erhalten, wurden in diesem Code die entsprechenden SQL-Abfragen in Sphinx gebildet, die Verarbeitung wurde ausgeführt und die Ausgabe wurde im JSON- oder HTML-Format gesendet. Die Benutzer haben dann gesehen, wonach sie gesucht haben.



    Was haben wir jetzt?


    Wenn Sie neue Funktionen implementieren, ist die Integration mit diesem Monolith sehr schwierig. Deshalb haben wir uns entschlossen, einen Suchdienst zu entwickeln, der Iskalo hieß. Nun geht der Monolith zu diesem Suchdienst, und der Dienst geht zu Sphinx.



    Die Gründe für die Erstellung eines Suchdienstes


    Bei der Entwicklung von Services sollten Sie immer verstehen, warum Sie dies tun. Der erste offensichtliche Vorteil ist die Entfernung der Low-Level-Logik. In unserem Fall verbirgt dies die Küche für die Bearbeitung von SphinxQL-Anfragen. Darüber hinaus können wir Suchsystemen für Systeme von Drittanbietern einfacher bereitstellen.


    Asynchrone Abfrageausführung Dieser Vorteil liegt auf der Hand und je nach Implementierung kann ein Erfolg erzielt werden. Unser Service ist auf Golang implementiert, und es gab eine Funktion, die parallelisiert werden konnte - drei Abfragen in Sphinx, die zu guten Ergebnissen führten.


    Schnelle Bereitstellung Wir haben eine separate Funktionalität mit einer geringeren Menge an Code und zusätzlichen Tests (es gibt viele Tests im Monolith, nicht nur für die Suchfunktion), und es ist einfacher zu implementieren. Das Wichtigste ist, dass wir aufgrund des erfolgreichen Ansatzes bei der Implementierung dieses Dienstes interessante Teile ablegen und fortgeschrittene Ranking-Algorithmen implementieren konnten - eine ziemlich komplexe Verarbeitung, die wir im Monolith nicht ausführen konnten. Dies gibt uns eine sehr gute Grundlage, um Experimente mit Suchqualität durchzuführen.


    Als Bonus haben wir die Möglichkeit, von Sphinx zu Elastic zu wechseln, da die Low-Level-Logik jetzt verborgen ist.


    Dieses Diagramm zeigt bereits den Fall eines Monolithen, des Iskalo-Dienstes und des Avito Assistant-Dienstes eines Drittanbieters.



    Wie funktioniert der Suchdienst?


    Es verfügt über eine Reihe von Aggregatoren. Jeder Aggregator führt eine Geschäftslogik aus, die sich auf die Bearbeitung des Problems bezieht. Es kann dieses Problem auf eine bestimmte Weise bilden.


    Die Anforderung geht an den Scheduler. Entsprechend den Abfragekriterien wählt der Scheduler den Aggregator aus der Sicht seiner Parameter aus (oder wenn der erforderliche Aggregator in der Abfrage selbst angegeben ist). Der Aggregator geht zur Sphinx. Nachdem er eine Antwort von Sphinx erhalten hat, generiert er das Problem und gibt dem Kunden die Antwort.



    In diesem Fall war die Anfrage außerhalb der Cloud, in der unser Suchdienst betrieben wird. Es ist jedoch auch eine andere Option möglich: Ein anderer Dienst von uns, beispielsweise Avito Helper, in der Cloud nimmt Kontakt mit dem Suchdienst auf. Diese Anforderung geht an einen anderen Aggregator - es gibt eine andere Geschäftslogik. So funktioniert es:



    Wie erfolgt die asynchrone Ausführung von Anforderungen im Aggregator?


    Der Aggregator besteht aus mehreren Profilen. Ein Profil ist grob gesagt eine Entität, in der Sie eine Anzeige eines bestimmten Typs oder auf bestimmte Weise erhalten können. Dies kann zum Beispiel durch eine Analogie erklärt werden: Avito hat Premium-, VIP- und regelmäßige Ankündigungen. Der Aggregator empfängt eine Anforderung vom Scheduler, während parallele Abfragen für die im Aggregator bekannten Profilsätze ausgeführt werden. Das Profil enthält einen Treiber, der die darunter liegende Schicht (in diesem Fall in Sphinx) physisch anspricht, es kann sich jedoch auch um eine andere Datenquelle handeln.



    Der Aggregator kann dem Scheduler einfach die Ergebnisse von Abfragen nach Profilen geben und er kann auch komplexere Aktionen ausführen, beispielsweise um diese Ergebnisse gemäß dem einen oder anderen Algorithmus zu mischen.



    Suchindexspeicher


    Aufgrund der Tatsache, dass wir Kubernetes in der Architektur verwenden, wurde mir bei RIT ++ die Frage gestellt, wie ein Suchindex gespeichert werden soll. Wird er in Kubernetes gespeichert? Nein, wir haben Sphinx auf physischen Maschinen. In Kubernetes haben wir einen Suchdienst, der die Suchlogik verarbeitet. In der Cloud liegt auch das Suchindexbeispiel für die Entwicklungsumgebung, in der Tests ausgeführt werden. Es ist jedoch nicht wünschenswert, einen Kampfindex dort zu platzieren, da die Dienste, die in Kubernetes funktionieren, in erster Linie stateless-Dienste sind.


    Suchdienst laden


    Jetzt ist dieser Dienst im Kampf, er dient bis auf wenige Ausnahmen zu 100%. Die Last, die er hält, beträgt etwa 200 krpm. Verzögerung: Median - bis zu 17 ms, 95 Perzentil - bis 120 ms, 99 Perzentil - bis 320 ms.




    Suchdienst insgesamt


    Der Suchdienst ist in Golang geschrieben und in Kubernetes implementiert. Der Aggregator arbeitet asynchron mit mehreren Profilen. Das Profil arbeitet mit dem angegebenen Treiber, der Treiber greift auf die angegebene Datenquelle zu, z. B. Sphinx. Die Anzahl der Anfragen, die unser Service bedient, beträgt im Moment bis zu 200 krpm. Verzögerung: Median - bis zu 17 ms, 95 Perzentil - bis 120 ms, 99 Perzentil - bis 320 ms.


    Einführung des Dienstes in das Arbeitssystem


    Das Problem der doppelten Funktionalität ist offensichtlich, wir müssen zwei Codebasis unterhalten, die dieselbe Aufgabe ausführen müssen. Wir brauchen einen Rückfall. Wir nannten es "Straws" - wir erinnerten uns an "Stroh verbreiten". Darüber hinaus benötigen wir ein Verkehrsmanagement. Es ist wünschenswert, dass es über Dashboards schnell ist.


    Wie funktioniert das "Stroh"?


    Die Suchabfrage kommt zu Straws, das innerhalb des Monolithen läuft und entweder die neue Suche oder die alte weiter aufrufen kann. Sie ruft eine neue Suche auf, die klappt, und wenn sie erfolgreich ist, erhalten wir nur die Ausgabe der neuen Suche.



    Es gibt Situationen, in denen eine Anfrage an den Suchdienst verschüttet wurde: zum Beispiel bis eine Funktionalität innerhalb des Suchdienstes implementiert wurde. Dann werden wir sicherlich eine solche Bitte verpfänden - "Straws" wird es in der alten Suche erfüllen. Die alte Suche aus dem Monolithen wird sich an Sphinx wenden, und die Antwort geht an den Kunden. Der Kunde wird nichts fühlen.



    Eher ein zuverlässiger Plan, und es ist immer interessant zu sehen, was in der Praxis passiert. Die Architekturabteilung von Avito verbessert ständig unsere Cloud, Tyunit, macht sie zuverlässiger und produktiver. Irgendwann gab es Probleme, dass bei der Wartung eines der Knoten Fehler mit einer ausreichend hohen Intensität aus dem Monolithen gingen (100 Fehler pro Sekunde).



    Gleichzeitig ist die Verspätung im Service stark gestiegen - in der Abbildung unten sehen Sie Spitzen.



    „Straw“ hat diese Situation wunderbar gemeistert, und die resultierenden HTTP-Fehler waren auf demselben Niveau - eine Einheit von Fehlern für den gesamten Avito. Unsere Besucher haben nichts bemerkt.



    Automatisierung von Experimenten


    Wir möchten, dass sich die Suche schnell entwickelt, und es war einfacher, neue Funktionen einzuführen. Dafür benötigen Sie die entsprechende Infrastruktur. Wir haben die Automatisierung von A / V-Tests eingerichtet. Mit Hilfe von Dashboards können wir neue Experimente starten, basierend auf den hinzugefügten Neuerungen konfigurieren und dementsprechend Experimente durchführen, ohne einen Monolithen auszurollen.


    Im Ausgangszustand, wenn kein einziges Experiment gestartet wurde, sehen alle Besucher die üblichen Suchfunktionen.



    In einem typischen Experiment werden Benutzer in Gruppen unterteilt. Die Kontrollgruppe - mit der üblichen Funktionalität für unsere Besucher. Es gibt mehrere Testgruppen - mit Innovationen. Wenn Sie ein neues Experiment erstellen müssen, implementieren wir im Suchdienst eine neue Suchfunktion (fügen Sie neue Aggregatoren hinzu) und richten ein Experiment mit den erforderlichen Gruppen über die Dashboards ein und verbinden diese mit neuen Aggregatoren.


    Bei der Analyse der Experimente vergleichen wir das Verhalten der Besucher in der Kontrollgruppe mit den Testgruppen und ziehen daraus Rückschlüsse auf den Erfolg des Experiments.



    Angenommen, wir haben eine neue Bewertungsformel entwickelt. Was müssen wir tun, um damit zu experimentieren?


    1. Führen Sie im Suchdienst den entsprechenden Aggregator aus ("Aggregator 2").
    2. Erstellen Sie über die Dashboards ein Experiment und verknüpfen Sie eine der Gruppen in diesem Experiment mit diesem Aggregator.
    3. Wenn nun eine Suchanforderung eingeht, die in die Testgruppe fällt, wird sie an den Suchdienst von Aggregator 2 weitergeleitet.

    Wir können weiterhin neue Experimente erstellen und ihre Testgruppen mit neuen Aggregatoren verknüpfen.


    Infrastruktur insgesamt suchen


    Es gibt einen Cluster von Sphinx-3-Servern mit 13 krps SphinxQL-Abfragen und mehr als 45 Millionen aktiver Anzeigen.


    Sphinx 3.0 ist stabil und zufrieden mit seiner Leistung. Übrigens Open Source Binaries . Dank Avito in Sphinx 3 werden außerdem neue Funktionen, z. B. der Betrieb des Skalarprodukts von Vektoren, aufgeschrieben und die gefundenen Fehler behoben.


    Wir verwenden die Service-Architektur. Wir haben einen Suchdienst "Iskalo" und den Dienst "Avito Assistant". Ein Teil der Funktionalität befindet sich noch im Monolithen, wir werden ihn jedoch weiter reduzieren.


    Schlussfolgerungen


    Im vergangenen Jahr wurde ein fortschrittliches Suchmaschinenentwicklungssystem erhalten. Wir hatten die Möglichkeit, schnelle und flexible Experimente durchzuführen. Und jetzt ist die Suche nach Benutzern einfacher geworden, um Probleme schneller und besser lösen zu können.


    Was weiter


    Dann werden wir vom Monolith aus weiter ausführen, was übrig bleibt: Rendering, Filter. Wir werden daran arbeiten, die Qualität der Suche zu verbessern und unsere Besucher weiterhin zu begeistern. Ich hoffe auch du


    Wenn Sie Fragen zur Arbeit unserer Suche haben und weitere technische Details erfahren möchten, schreiben Sie in den Kommentaren. Ich werde gerne antworten. Andrei Drozdov sprach übrigens kürzlich auf der Highload ++ 2018 mit einem Bericht über die Optimierung der Suchergebnisse nach Kriterien , hier ist seine Präsentation .


    Jetzt auch beliebt: