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.
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)\nBereitgestellt von
\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.
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.
Gewinne Vertrauen in die OLS-Regression, indem du ihre theoretischen Grundlagen beherrschst. Erforsche, wie du einfache Implementierungen in Excel, R und Python durchführst.
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.
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.
Erforsche Pythons match-case: eine Anleitung zu seiner Syntax, Anwendungen in Data Science und ML sowie eine vergleichende Analyse mit dem traditionellen switch-case.
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.
\nIm heutigen Technical Blog-Beitrag zeigen wir die Technologien und Methoden, mit denen wir unseren Nutzern relevante und aussagekräftige Ergebnisse liefern.
\nElasticsearch
\nRDocumentation.org nutzt Elasticsearch, um alle R-Pakete und -Themen zu indexieren und zu durchsuchen.
\n\nElasticsearch 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.
\nEin 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.
\nRDocumentation.org verwendet drei Typen:
\npackage_version,topicundpackage. Die ersten beiden sind die wichtigsten;packagebesprechen wir später.Da RDocumentation.org Open Source ist, kannst du die Mappings für Elasticsearch in unserem GitHub-Repo einsehen.
\npackage_version-Typ
\nDer Typ
\npackage_versionist im Grunde eine Übersetzung derDESCRIPTION-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,maintainerundcollaborators. Die Feldermaintainerundcollaboratorswerden aus demAuthors-Feld derDESCRIPTION-Datei extrahiert.topic-Typ
\nDie Topic-Dokumente werden aus den
\nRd-Dateien geparst, dem Standardformat für R-Dokumentation. Dertopic-Typ enthält die folgenden Keys:name,title,description,usage,details,value,references,note,author,seealso,examples,created_at,updated_at,sections,aliasesundkeywords.Scoring in Elasticsearch
\nBevor 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.
\nEine Ü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.
\nElasticsearch 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.
\nWenn du mehr darüber lernen willst, wie diese Funktion in Elasticsearch eingesetzt wird, schau dir diesen Abschnitt im Guide auf elastic.co an.
\nEine Möglichkeit, die Relevanz zu verbessern, ist das gezielte Boosten einzelner Felder. In der Volltextsuche auf RDocumentation.org boosten wir zum Beispiel Felder wie
\npackage_nameundtitlebei Paketen sowiealiasesundnamebei Topics.Beliebte Dokumente boosten
\nEine 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.
\nDownloads als Popularitätsmaß
\nPopularitä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).
\nBei 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.
\nZeitfenster
\nEin 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?
\nUm 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.
\nDirekte vs. indirekte Downloads
\nEin 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.
\nEin 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.
\nZur 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.
\nDamit 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.
\nDer Score wird wie folgt angepasst:
\nWir verwenden die Funktion
\nlog(), um dieAnzahl der Downloadszu 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.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.
\nWenn 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
\nSearchController.Wenn du mehr darüber lernen willst, wie RDocumentation.org aufgebaut ist, schau dir unsere Repos an:
\n\n- RDocumentation-app: Die Webanwendung hinter rdocumentation.org.
\n- RDocumentation-elasticsearch: Konfiguration und Feeder des Elasticsearch-Servers für rdocumentation.org.
\n- RDocumentation: R-Paket, um rdocumentation.org in deinen R-Workflow zu integrieren
\n- RDocumentation-lambda-worker: AWS-Lambda-Pipeline zum Parsen der Paketdokumentation für rdocumentation.org
\n
\n
\nÜber RDocumentation
\nRDocumentation 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