Intelligente Such-Sortierung mit Vue.JS

Eine search-as-you-type Suche ist mit Vue.js schnell und einfach implementiert. Komplizierter wird es mit der Sortierung möglicher Suchtreffer. Nehmt als Beispiel eine Liste bestehend aus Vor- und Nachnamen, die ihr nach dem Wort Muster durchsucht. Sortiert ihr die Treffer alphabetisch, so bekommt ihr ggf. folgendes Ergebnis:

  • Alfred Hamuster
  • Erika Mustermann
  • Willi Muster

Die Sortierung ist für den Menschen allerdings wenig intuitiv. Wenn ich nach Muster suche, erwarte ich dass Willi Muster ganz oben bei den Treffern steht. Stattdessen steht dort aber Alfred Hamuster, nach dem ich vermutlich eher nicht gesucht habe. Gerade bei sehr langen Ergebnis-Listen kann es störend sein, wenn die relevanten Treffer unten stehen und oben nur irrelevant Einträge sich befinden.

In diesem Blog-Post zeige ich euch, wie ihr eine natürlichere Sortierung der Suchtreffe hinbekommt.

Vue.js

Vue.js ist ein modernes JavaScript-Framework, mit dem sich interaktive Anwendungen vergleichsweise einfach programmieren lassen. Die Grundlagen von Vue.js hat man recht schnell gelernt, z.B. mittels diesem Tutorial: Vue.js Getting started.

Ich persönlich mag Vue.js deutlich lieber als andere JavaScript-Frameworks, wie z.B. React, da sich Vue.js sehr bequem in existenten HTML integrieren lässt. Gerade wenn Teile der Website mit PHP entwickelt sind, kann man Vue.js an den entsprechend notwendigen Stellen schnell und einfach einbinden. Betreibt ihr beispielsweise ein online Casino mit Lastschrift und möchtet gewisse Elemente interaktiv gestalten, so wäre Vue.js die ideale Wahl dafür.

Natürliche Sortierung

Um eine natürlich wirkende Sortierung hinzubekommen, nutze ich ein paar Heuristiken um zu schauen ob ein Treffer relevant als der andere für eine gegeben Suchanfrage ist:

  • Prio 1 - Exakte Übereinstimmung: Wenn ein Eintrag identisch zur Suchanfrage ist, soll dies die höchste Priorität haben und ganz oben im Suchergebnis stehen.
  • Prio 2 - Wortanfang: Ist die Suche der Wortanfang von einem Eintrag, so erhält es die Prio 2 in der Sortierung.
  • Prio 3 - Enthält die Wörter exakt: Enthält ein Eintrag exakt alle Wörter der Suche, so bekommt es die Prio 3 in der Sortierung.
  • Prio 4 - Such-Wörter sind Wortanfänge: Die verschiedenen Suchwörter sind die Wortanfänge in dem Eintrag. Für die Suche Muster soll Mustermann vor Hamuster stehen.

Dies sind vier von mir ausgedachte Heuristiken. Ihr könnt natürlich für eure Anwendung andere Heuristiken verwenden, diese um weitere ergänzen etc. Man muss entsprechend immer schauen, was der Anwender als erste Treffer in der Liste erwartet. Vielleicht macht es ja Sinn, dass kürzere Treffer weiter oben stehen? Oder dass Vornamen wichtiger sind als Nachnamen?

Implementierung mittels Vue.Js

Der fertige Code sieht wie folgt aus:

Zuerst filtern wird die Suchergebnisse:

und behalten nur die Einträge, die den Suchstring enthalten. Groß- und Kleinschreibung wird dabei ignoriert. Man könnte das Filtern hier auch besser gestalten, indem man die Suchanfrage aufteilt in einzelne Wörter und schaut ob jedes Wort im Eintrag vorhanden ist.

Anschließend weisen wir jedem Namen einen Score zu:

Hier könnt ihr beliebige weitere Sortierregeln implementieren, z.B. könnten kurze Treffer bevorzugt werden und eine geringere Priorität bekommen.

Zum Schluss nutzen wir noch eine Hilfsfunktion, die die Namen basierend auf den Prioritäten sortiert:

 

Fertiges npm Package - match-sorter

Wer sich nicht den Aufwand machen möchte dies selber zu implementieren, dem kann ich das fertige Package match-sorter empfehlen. Dies lässt sich per npm installieren und nutzt ebenfalls verschiede Methoden, um Treffer besser (natürlicher) zu sortieren:

 

 

Autor:
Zurück zur Übersicht aller Beiträge