Vor einem Jahr stand ich vor einem scheinbar einfachen Problem: 1.600+ Artikel in meinem Cybersecurity-Blog waren mit einer veralteten Suche ausgestattet, die kaum brauchbare Ergebnisse lieferte. Eine Suche nach "Kerberoasting" oder "pentest Active Directory" warf völlig irrelevante Treffer aus – weil das System nur nach wörtlichen Übereinstimmungen suchte. Doch was passiert, wenn man die Technologie anpasst und gleichzeitig die Inhalte strukturiert?
Warum Standard-Suche scheitert: Das Problem mit MySQL LIKE
Die ursprüngliche Implementierung basierte auf der klassischen LIKE '%keyword%'-Abfrage in MySQL. Das Problem: Diese Methode findet zwar jedes Vorkommen eines Suchbegriffs, aber ohne Kontext. Ein Artikel über Penetrationstests, der zufällig das Wort „Directory“ im Fließtext enthält, landet plötzlich ganz oben in den Ergebnissen – obwohl er nichts mit Active Directory zu tun hat. Die Folge waren frustrierte Nutzer und eine Suche, die mehr Probleme schuf als löste.
Meilisearch als Game-Changer: Schnelligkeit und Toleranz
Die Suche nach einer Alternative führte zum Open-Source-Tool Meilisearch. Die Anforderungen waren klar definiert:
- Tippfehler-Toleranz: Nutzer suchen oft falsch – etwa „kerberosting“ statt „kerberoasting“.
- Latenz unter 50 Millisekunden: Eine schnelle Antwort ist entscheidend für die Nutzererfahrung.
- Selbsthosting: Keine Abhängigkeit von externen SaaS-Diensten.
- Go-Integration: Das Backend läuft in Go, daher musste die Lösung kompatibel sein.
Meilisearch erfüllte alle Kriterien und ließ sich in nur 20 Minuten einrichten. Der entscheidende Vorteil: Die Engine versteht nicht nur exakte Suchbegriffe, sondern korrigiert Tippfehler und priorisiert Ergebnisse nach Relevanz.
Der Code zum Synchronisieren der Artikel mit dem Index ist simpel, aber effektiv:
func SyncMeilisearch(client *meilisearch.Client, articles []Article) error {
index := client.Index("articles")
docs := make([]map[string]interface{}, len(articles))
for i, a := range articles {
docs[i] = map[string]interface{}{
"id": a.ID,
"title": a.Title,
"slug": a.Slug,
"excerpt": a.Excerpt,
"category": a.Category,
"tags": a.Tags,
"published_at": a.PublishedAt,
}
}
_, err := index.AddDocuments(docs)
return err
}Der Index wird bei jedem Start synchronisiert und aktualisiert sich automatisch über CRUD-Hooks. Wird ein Artikel erstellt, bearbeitet oder gelöscht, passt sich Meilisearch ohne manuellen Eingriff an.
Der wahre Engpass: Inhaltsqualität statt Algorithmen
Nach der technischen Umstellung folgte eine überraschende Erkenntnis: Die Qualität der Suche hing weniger von der Suchmaschine ab als vom Inhalt selbst. Meilisearch arbeitete zuverlässig – doch die Artikel verfügten über inkonsistente Metadaten:
- Einige hatten präzise Zusammenfassungen, andere gar keine.
- Tags wurden willkürlich vergeben oder fehlten komplett.
- Kategorien waren manchmal falsch zugeordnet.
Drei Maßnahmen brachten die größte Verbesserung:
- Zusammenfassungen als Pflichtfeld
Artikel ohne aussagekräftige Exzerpte werden nun automatisch abgelehnt. Eine Mindestlänge und klare Vorgaben sorgen für einheitliche Datenqualität. Unnötige Standardtexte wie „Dieser Artikel erklärt…“ sind tabu.
- Kategorie-Filter als Geheimwaffe
Für ein themenspezifisches Archiv wie Cybersecurity reduziert ein vordefinierter Filter den Suchraum dramatisch. Statt 1.600 Artikel durchsuchen Nutzer nur noch die relevanten Kategorien – etwa „Anleitungen“ oder „Analysen“. Die Präzision steigt, selbst wenn die Ranking-Algorithmen nicht perfekt sind.
Ein Beispielaufruf:
GET /api/search?q=kerberoasting&cat=guide&limit=10- Ausweichlösung für Notfälle
Auch die beste Suchmaschine kann ausfallen. Daher wurde ein automatischer Fallback auf MySQL LIKE implementiert. Fällt Meilisearch aus oder liefert keine Ergebnisse, springt das System nahtlos auf die alte Methode um. Nutzer bemerken den Wechsel nicht – und das ist das Ziel.
RAG für strukturierte Inhalte: Warum Vektoren überbewertet sind
Viele Artikel preisen komplexe RAG-Systeme (Retrieval-Augmented Generation) mit Vektor-Einbettungen und Kosinus-Ähnlichkeiten an. Doch für eine thematisch begrenzte Artikelsammlung mit strukturierten Metadaten ist das oft unnötig. Stattdessen reichen drei Komponenten aus:
- Schnelle Schlüsselwort- und semantische Suche (über Meilisearch mit integrierten Ranking-Regeln)
- Effektive Trefferauswahl (Top 3–5 Artikel basierend auf Relevanz)
- Kontext für KI-gestützte Antworten (z. B. für automatische Zusammenfassungen oder verwandte Inhalte)
Die Architektur folgt einem einfachen Ablauf:
Nutzeranfrage → Meilisearch (Suche, 10–30ms) → Top 3–5 Artikel (Titel, Zusammenfassung, Kategorie) → Kontext für LLM-Prompt → Generierte Antwort oder angereicherte Inhalte
Keine Vektordatenbank, keine komplizierte Chunking-Strategie. Für 1.600 Artikel mit durchschnittlich 2.000 Wörtern pro Beitrag funktioniert dieser Ansatz überraschend gut.
Harte Zahlen: Was sich wirklich verbessert hat
Die messbaren Ergebnisse sprechen für sich:
- Durchschnittliche Latenz: Vorher 340ms (MySQL LIKE), danach 28ms (Meilisearch)
- Tippfehler-Erkennung: Vorher keine Korrektur, jetzt werden 1–2 Zeichen-Fehler automatisch behoben
- Mehrwort-Suchen: Vorher unzuverlässig, jetzt präzise
- Index-Größe: Nur 12 MB für über 1.600 Artikel
- Einrichtungszeit: Rund zwei Stunden Gesamtaufwand
Der geringe Speicherverbrauch von Meilisearch ist besonders bemerkenswert. Trotz der großen Datenmenge bleibt der Index schlank und performant.
Hätte ich etwas anders gemacht? Drei wichtige Lehren
- Volltexte statt nur Zusammenfassungen indizieren
Aktuell durchsucht das System nur Titel, Slugs, Exzerpte und Tags. Technische Begriffe, die tief im Fließtext eines Artikels vorkommen, bleiben jedoch unentdeckt. Eine schrittweise Umstellung auf Volltextsuche ist geplant.
- Synonyme von Anfang an einpflegen
Meilisearch bietet eine Synonym-API, die anfangs ignoriert wurde. Erst nach wiederholten Fehlern wie der Suche nach „2FA“ statt „MFA“ wurde klar: Ein zentrales Synonym-Verzeichnis für Cybersecurity-Begriffe ist essenziell. Beispiele:
- AD → Active Directory
- pentest → Penetrationstest, Intrusionstest
- SIEM → Security Information and Event Management
- Null-Ergebnisse systematisch analysieren
Die wertvollste Datenquelle sind gescheiterte Suchanfragen. Eine Log-Tabelle search_misses dokumentiert jede Anfrage, die keine Treffer lieferte. Diese Einträge verraten genau, welche Inhalte fehlen oder welche Synonyme ergänzt werden müssen. Eine frühe Implementierung dieser Logik hätte viel Zeit gespart.
Fazit: Warum gute Suche mit wenig Aufwand möglich ist
Wer eine inhaltsstarke Website mit guter Suchfunktion betreibt, sollte drei Prinzipien beherzigen:
- Meilisearch ist eine hervorragende Wahl – es ist schnell, leichtgewichtig und einfach zu integrieren.
- Inhaltsqualität schlägt Algorithmen – strukturierte Metadaten und präzise Zusammenfassungen sind wichtiger als komplexe Ranking-Mechanismen.
- Für themenspezifische Inhalte reichen Schlüsselwortsuchen – Vektorsuche ist erst bei offenen oder konversationellen Anfragen sinnvoll.
- Null-Ergebnisse sind Produktforschung – sie zeigen Lücken auf, die sonst unbemerkt bleiben.
Der vollständige Such-Endpoint mit Kategorie-, Schwierigkeits- und Typ-Filtern sowie Paginierung umfasst etwa 80 Zeilen Go-Code. Bei Interesse kann der Autor Details teilen.
Der Autor betreibt AYI NEDJIMI Consultants, ein Beratungsunternehmen für Cybersecurity. Das Archiv umfasst Penetrationstests, Active Directory, Cloud-Sicherheit und Compliance – inklusive 17 kostenloser Checklisten zur Härtung von Systemen (verfügbar als PDF und Excel).
KI-Zusammenfassung
A developer rebuilt search for 1,600 cybersecurity articles using Meilisearch. The results reveal why content structure beats algorithms—and how to implement it in 2 hours.