Weiter zum Inhalt

RDocumentation: Scoring und Ranking

Erfahre, wie die Suchergebnisse auf RDocumentation entstehen!
Aktualisiert 18. Sept. 2026  · 7 Min. lesen

Mit KI erkunden

ChatGPTClaudePerplexity

Eine der Kernfunktionen von RDocumentation.org ist die Suche. Von Anfang an wollten wir eine super einfache Suchleiste, die findet, was du suchst – ohne komplizierte Formulare für Paketnamen, Funktionsnamen, Versionen oder Ähnliches. Einfach eine Suchleiste.

\n

Im heutigen Technical Blog-Beitrag zeigen wir die Technologien und Methoden, mit denen wir unseren Nutzern relevante und aussagekräftige Ergebnisse liefern.

\n

Elasticsearch

\n

RDocumentation.org nutzt Elasticsearch, um alle R-Pakete und -Themen zu indexieren und zu durchsuchen.

\n
\n

Elasticsearch ist eine Open-Source-, skalierbare, verteilte Suchmaschine in Enterprise-Qualität.

\n
\n

Elasticsearch eignet sich ideal für die Abfrage von Dokumentation, weil es nicht auf klassischem SQL basiert, sondern Dokumente in einer JSON-ähnlichen Datenstruktur speichert. Jedes Dokument ist eine Menge aus Key-Value-Paaren mit einfachen Datentypen (Strings, Zahlen, Listen, Datumswerte, …). Durch die verteilte Architektur ist Elasticsearch extrem schnell.

\n

Ein Elasticsearch-Cluster kann mehrere Indizes haben und jeder Index mehrere Dokumenttypen. Ein Dokumenttyp beschreibt, wie die Struktur eines Dokuments aussehen soll. Mehr zu Elasticsearch-Typen findest du in diesem Guide auf elastic.co.

\n

RDocumentation.org verwendet drei Typen: package_version, topic und package. Die ersten beiden sind die wichtigsten; package besprechen wir später.

\n

Da RDocumentation.org Open Source ist, kannst du die Mappings für Elasticsearch in unserem GitHub-Repo einsehen. 

\n

package_version-Typ

\n

Der Typ package_version ist im Grunde eine Übersetzung der DESCRIPTION-Datei eines Pakets und enthält die wichtigsten Felder daraus: package_name, version, title, description, release_date, license, url, copyright, created_at, updated_at, latest_version, maintainer und collaborators. Die Felder maintainer und collaborators werden aus dem Authors-Feld der DESCRIPTION-Datei extrahiert.

\n

topic-Typ

\n

Die Topic-Dokumente werden aus den Rd-Dateien geparst, dem Standardformat für R-Dokumentation. Der topic-Typ enthält die folgenden Keys: name, title, description, usage, details, value, references, note, author, seealso, examples, created_at, updated_at, sections, aliases und keywords.

\n

Scoring in Elasticsearch

\n

Bevor es ans Scoring geht, reduziert Elasticsearch zunächst die Kandidatenmenge, indem geprüft wird, ob ein Dokument überhaupt zur Suchanfrage passt. Eine Query ist im Grunde ein Wort (oder mehrere Wörter). Basierend auf den Query-Einstellungen sucht Elasticsearch in bestimmten Feldern bestimmter Typen nach Übereinstimmungen.

\n

Eine Übereinstimmung bedeutet jedoch nicht automatisch, dass das Dokument relevant ist; dasselbe Wort kann in verschiedenen Kontexten Unterschiedliches bedeuten. Über die Query-Einstellungen können wir nach Typ und Feld filtern und mehr Kontext einbeziehen. Diese Kontextinformationen erhöhen die Relevanz – hier kommt das Scoring ins Spiel.

\n

Elasticsearch setzt unter der Haube auf Lucene, das Scoring basiert also auf Lucenes Practical Scoring Function. Diese vereint Modelle wie TF-IDF, das Vektorraummodell und das Boolesche Modell zu einem Gesamtscore.

\n

Wenn du mehr darüber lernen willst, wie diese Funktion in Elasticsearch eingesetzt wird, schau dir diesen Abschnitt im Guide auf elastic.co an.

\n

Eine Möglichkeit, die Relevanz zu verbessern, ist das gezielte Boosten einzelner Felder. In der Volltextsuche auf RDocumentation.org boosten wir zum Beispiel Felder wie package_name und title bei Paketen sowie aliases und name bei Topics.

\n

Beliebte Dokumente boosten

\n

Eine weitere wirksame Methode zur Relevanzsteigerung ist das Boosten basierend auf Popularität. Die Idee dahinter: Je beliebter ein Paket ist, desto eher sucht jemand genau danach. Wenn wir die populäreren Pakete zuerst anzeigen, steigt die Chance, dass wir genau das zeigen, wonach gesucht wird.

\n

Downloads als Popularitätsmaß

\n

Popularität lässt sich verschieden messen. Möglich sind direkte Kennzahlen wie Bewertungen oder Rankings (wie Produktbewertungen bei Amazon) oder indirekte Kennzahlen wie Verkaufszahlen oder Aufrufe (z. B. bei YouTube-Videos).

\n

Bei RDocumentation.org haben wir uns für den indirekten Ansatz entschieden. Konkret nutzen wir die Anzahl der Downloads als Popularitätsindikator. Indirekte Kennzahlen sind meist leichter zu erheben, weil sie keine aktive Nutzereingabe erfordern.

\n

Zeitfenster

\n

Ein Problem bei der Nutzung von Downloadzahlen: Ältere Pakete haben naturgemäß mehr Gesamtdownloads als neuere. Das heißt aber nicht automatisch, dass sie beliebter sind – sie sind nur länger verfügbar. Was, wenn ein Paket früher sehr beliebt war, inzwischen aber veraltet ist und kaum noch aktiv genutzt wird?

\n

Um das zu lösen, berücksichtigen wir nur die Downloads des letzten Monats. So werden ältere Pakete nicht künstlich nach oben gespült und veraltete Pakete verschwinden schnell aus dem Rampenlicht.

\n

Direkte vs. indirekte Downloads

\n

Ein weiteres Problem ergibt sich aus Reverse-Dependencies. R-Pakete hängen typischerweise von vielen anderen Paketen ab. Pakete mit vielen Reverse-Dependencies werden deutlich häufiger heruntergeladen als andere. Diese Pakete sind jedoch meist Low-Level und werden nicht direkt von Endnutzenden verwendet. Wir müssen vermeiden, ihrer Downloadzahl zu viel Gewicht zu geben.

\n

Ein Beispiel ist Rcpp. Über 70 Prozent aller Pakete auf CRAN, dem Comprehensive R Archive Network, hängen von diesem Paket ab – dadurch ist es das am häufigsten heruntergeladene R-Paket. Dennoch werden es relativ wenige R-Nutzende direkt verwenden oder gezielt nach seiner Dokumentation suchen.

\n

Zur Lösung mussten wir direkte Downloads (Downloads, die auf eine explizite Anforderung durch den Nutzer zurückgehen) und indirekte Downloads (Downloads, die erfolgen, weil ein abhängiges Paket installiert wird) trennen. Um direkte und indirekte Downloads in den CRAN-Logs zu unterscheiden, nutzen wir dieselbe Heuristik wie im cran.stats-Paket von Arun Srinivasan.

\n

Damit erhalten wir eine aussagekräftige Popularitätsmetrik: die Anzahl direkter Downloads im letzten Monat. Elasticsearch bietet eine einfache Möglichkeit, diese Zusatzinformation ins Scoring einfließen zu lassen; Details findest du in diesem Artikel auf elastic.co.

\n

Der Score wird wie folgt angepasst:

\n
\n
new_score = old_score * log(1 + number of direct downloads in the last month)\n
\n
\n

Wir verwenden die Funktion log(), um die Anzahl der Downloads zu glätten. Denn jeder zusätzliche Download wiegt weniger: Der Unterschied zwischen 0 und 1.000 Downloads sollte sich stärker im Popularitätsscore niederschlagen als der zwischen 100.000 und 101.000 Downloads.

\n

Dieses Re-Scoring verbessert die Gesamtqualität der Suchergebnisse auf RDocumentation.org. So kannst du dich aufs Lesen der Dokus konzentrieren – statt auf die Suche danach.

\n

Wenn du genauer wissen willst, wie die Elasticsearch-Query implementiert ist, wirf einen Blick auf das RDocumentation-Projekt auf GitHub. Die Query selbst findest du im SearchController.

\n

Wenn du mehr darüber lernen willst, wie RDocumentation.org aufgebaut ist, schau dir unsere Repos an:

\n\n



\n

Über RDocumentation 

\n

RDocumentation bündelt Hilfedokumentation für R-Pakete aus CRAN, BioConductor und GitHub – den drei gängigsten Quellen aktueller R-Dokumentation. RDocumentation.org geht aber über das reine Aggregieren hinaus und bringt dir all diese Dokumentation mit dem RDocumentation-Paket direkt an die Hand. Das RDocumentation-Paket überschreibt die grundlegenden Hilfe-Funktionen aus dem utils-Paket und gibt dir Zugriff auf RDocumentation.org direkt in deiner RStudio-IDE. Finde die neuesten und beliebtesten R-Pakete, durchsuche Dokumentation und veröffentliche Community-Beispiele. 

\n

\"\"

\n
Themen
R
Verwandt

Tutorial

Python range()-Funktion Tutorial

Lerne anhand von Beispielen die Python-Funktion range() und ihre Möglichkeiten kennen.
Aditya Sharma's photo

Aditya Sharma

7 Min.

Tutorial

Auf 2 Dezimalstellen runden in Python: 7 Methoden erklärt

Lerne, wie du Zahlen in Python mit round(), f-Strings, format(), dem decimal-Modul, NumPy und mehr auf zwei Dezimalstellen rundest — inklusive Vergleichstabelle der Methoden.
Allan Ouko's photo

Allan Ouko

7 Min.

Tutorial

Wie sortiert man ein Wörterbuch in Python nach Werten?

Lerne effiziente Methoden, um ein Wörterbuch in Python nach Werten zu sortieren. Lerne, wie du Sachen aufsteigend oder absteigend sortieren kannst, und hol dir ein paar coole Tipps zum Sortieren von Schlüsseln.
Neetika Khandelwal's photo

Neetika Khandelwal

5 Min.

Tutorial

Python Switch Case Statement: Ein Leitfaden für Anfänger

Erforsche Pythons match-case: eine Anleitung zu seiner Syntax, Anwendungen in Data Science und ML sowie eine vergleichende Analyse mit dem traditionellen switch-case.
Matt Crabtree's photo

Matt Crabtree

5 Min.

Tutorial

Python Datenstrukturen Tutorial

Mach dich mit Python-Datenstrukturen vertraut: Lerne mehr über Datentypen und primitive sowie nicht-primitive Datenstrukturen wie Strings, Listen, Stapel usw.
Sejal Jaiswal's photo

Sejal Jaiswal

24 Min.

Tutorial

Fibonacci-Folge in Python: Lerne und entdecke Programmiertechniken

Finde raus, wie die Fibonacci-Folge funktioniert. Schau dir die mathematischen Eigenschaften und die Anwendungen in der echten Welt an.
Laiba Siddiqui's photo

Laiba Siddiqui

6 Min.

Mehr AnzeigenMehr Anzeigen