BM25 – das Standard-Ranking 🎯
Seit den 90ern der Algorithmus für Suche – immer noch der Default in Elasticsearch, Lucene, Solr und vielen Online-Stores. Wir leiten die Formel her, drehen an den Knöpfen (k₁, b), schauen Varianten (BM25F, BM25+), und bauen einen funktionierenden BM25-Ranker in Python.
01Wieso BM25 – und nicht einfach TF-IDF?
Beide messen, wie gut ein Dokument zu einer Anfrage passt. BM25 macht's einfach besser.
BM25 (Best Matching 25) ist das Resultat einer Forschungsreihe von Stephen Robertson & Karen Spärck Jones in den späten 80ern/90ern – probabilistisch hergeleitet (daher der „BM"-Name). Drei Probleme von TF-IDF, die es löst:
- TF-Sättigung: Mehr Vorkommen → mehr Score, aber mit abnehmender Wirkung. Spam-resistent.
- Dokumentlängen-Normalisierung: Lange Docs werden nicht künstlich bevorzugt.
- Tuning-Parameter: Mit k₁ und b kann man auf den eigenen Corpus optimieren.
02Die Formel – Schritt für Schritt
Sie wirkt erstmal wild. Aber jede Komponente ist einzeln verständlich.
Die volle BM25-Score-Formel
In drei Teilen
Teil 1 · IDF: wie selten ist das Wort? (gleiche Idee wie bei TF-IDF, mit Smoothing)
Teil 2 · TF-Komponente: das Herz von BM25.
Setzt man b=0 und k₁→∞, wird das wieder zu linearer TF (klassisches TF-IDF). Setzt man k₁→0, wird's boolean (nur „ja/nein"). Die beiden Knöpfe interpolieren zwischen Extremen.
03Die beiden Knöpfe: k₁ und b
Stell dir BM25 als Mischpult vor. Zwei Regler – beide haben sehr unterschiedlichen Effekt.
k₁ · Sättigungs-Regler
Was er macht: Steuert, wie schnell der TF-Score „flach" wird.
k₁ = 0: Score ist boolean (Wort drin = 1, sonst 0)k₁ = 1.2: Default in Lucene/Elastic. Sättigt schnell.k₁ = 2.0: Lockerere Sättigung. Mehr TF zählt mehr.k₁ → ∞: Praktisch linear (wie TF-IDF)
Tipp: Bei sehr kurzen Docs (Tweets) niedriger setzen. Bei langen Docs (Papers) etwas höher.
b · Längen-Normalisierung
Was er macht: Steuert, wie stark Dokumentlänge bestraft wird.
b = 0: Länge wird ignoriertb = 0.75: Default. Mittelmaß.b = 1.0: Voll-Normalisierung. Lange Docs werden stark bestraft.
Tipp: News-Sites mit ähnlich langen Artikeln → b niedriger. Mixed-Length-Corpus (Tweets + Bücher) → b höher.
k₁=1.2, b=0.75 – das hat sich über Jahre als universell „gut genug" erwiesen. Für Domain-spezifische Suchen kann man durch Tuning ~10-20% Genauigkeit gewinnen.
04Durchgerechnet: ein konkretes BM25-Beispiel
Wir berechnen den Score für ein Dokument – Schritt für Schritt.
Setup:
- Query: roboter
- Doc-Länge: |d| = 100 Wörter
- Durchschnitts-Länge: avgdl = 80 Wörter
- tf(roboter, d) = 3 (Wort kommt 3x vor)
- N = 1'000'000 Dokumente im Index
- df(roboter) = 10'000 (Wort in 10k Docs)
- k₁ = 1.2, b = 0.75
Schritt 1 – IDF:
Schritt 2 – Normalisierter Term:
Schritt 3 – TF-Komponente:
Schritt 4 – Score:
Bei einer Multi-Word-Query summieren wir Scores über alle Query-Terms.
05BM25 in Python – mit rank_bm25
Eine kleine, produktionsreife Library für BM25.
Installiere mit pip install rank_bm25. Für kleine bis mittlere Datasets (Tausende Docs) ideal – schnell und ohne Setup.
06BM25-Varianten
Drei spannende Ableger – jeder mit eigenem Anwendungsfall.
BM25F – Felder unterschiedlich gewichten
In der Praxis besteht ein Dokument aus mehreren Feldern: Titel, Beschreibung, Body, Tags. BM25F erlaubt unterschiedliche Gewichte pro Feld – ein Treffer im Titel zählt z.B. 5× so viel wie im Body.
BM25+ – verhindert Score-Null
BM25 kann theoretisch sehr lange Dokumente auf einen Score nahe Null drücken, auch wenn das Wort drin ist. BM25+ fügt einen kleinen Boost (δ ≈ 1.0) hinzu, damit jedes Vorkommen mindestens etwas zählt.
BM25L – Längen-toleranter
Speziell für Corpora mit sehr unterschiedlich langen Docs (Mix aus kurzen und langen). Modifiziert die Längen-Normalisierung leicht.
"similarity": "BM25" ist überall im Hintergrund aktiv – ausser du wechselst explizit.
07Wann BM25 immer noch das Beste ist
Trotz allem KI-Hype: BM25 ist 2026 immer noch produktiv unterwegs. Hier wann.
✅ BM25 ist top, wenn …
- Du Wörter exakt matchen willst (Codes, IDs, Namen)
- Schnelligkeit und niedrige Kosten zählen
- Erklärbarkeit wichtig ist (du kannst zeigen, warum ein Doc gewinnt)
- Wenig oder kein Trainings-Daten verfügbar
- Multi-Sprache ohne speziell trainierte Modelle
⚠️ BM25 reicht nicht, wenn …
- Synonyme matchen müssen (Auto ↔ PKW)
- Semantisches Verstehen nötig ist
- Mehrsprachige Übersetzungs-Suche
- Long-tail Queries mit Tippfehlern
- Kontextuelle Suche („zeig mir die positive Bewertung")
→ Genau diese Fälle löst Embeddings + RAG – siehe Page 08.
🎯Key Takeaways
- BM25 löst TF-IDFs Schwächen mit Sättigung und Längen-Normalisierung.
- Zwei Knöpfe:
k₁(Sättigung) undb(Längen-Norm). Defaults: 1.2 / 0.75. - Die Formel ist im Kern:
IDF × (gesättigter TF / längennormierter Nenner). - BM25F erlaubt Feld-spezifische Gewichte – Titel ≠ Body.
- BM25+ verhindert Score-Null bei sehr langen Docs.
- Elasticsearch / Lucene / Solr nutzen BM25 als Default seit ~2016.
- BM25 ist auch 2026 noch unverzichtbar – kombiniert mit Embeddings (hybrid retrieval).