Eine in Python geschriebene Suchmaschine mit 80 Zeilen
- Im vergangenen September begann der Autor als Search Data Scientist bei Wallapop und arbeitet dort mit der Open-Source-Suchmaschine Solr.
- Um die Grundprinzipien von Suchmaschinen zu verstehen, entschied er sich, mit Python von Grund auf eine Suchmaschine zu bauen.
- Das Ziel ist, die „Auffindbarkeitskrise kleiner Websites“ zu lösen und kleine Websites, die sich mit Suchmaschinen wie Google nicht finden lassen, wieder groß zu machen.
- Dieser Artikel führt durch den Prozess, mit Python eine Suchmaschine zu bauen; der gesamte Code ist im GitHub-Repository
microsearch zu finden.
- Die implementierte Suchmaschine ist keine produktionsreife Suchmaschine, sondern ein nutzbares Spielzeugbeispiel, das zeigt, wie Suchmaschinen intern funktionieren.
microsearch
- Es wird betrachtet, aus welchen Bausteinen
microsearch besteht und wie jeder davon erstellt wurde: (1) Crawler, (2) invertierter Index, (3) Ranking, (4) Interface.
Crawler
- Der erste Schritt beim Bau einer Suchmaschine besteht darin, die zu durchsuchenden Daten zu beschaffen.
- Mit der Idee, ein „lokales Google“ zu bauen, wurde die Suchmaschine mit Daten aus den Blogs erstellt, denen der Autor folgt.
- Das Crawling umfasst das Herunterladen und Aufbereiten aller Beiträge aus einer bestimmten Blogliste.
- Um es zu beschleunigen, wurde die Python-Bibliothek
asyncio verwendet, wodurch sich die Crawling-Zeit von 20 Minuten auf 20 Sekunden verkürzte.
- Verwendet wurden 642 RSS-Feeds; davon sind etwa 100 häufig gelesene Blogs, die übrigen 500 stammen aus dem Blogprojekt surprisetalk.
Invertierter Index
- Ein invertierter Index ist eine Datenstruktur, die Keywords auf Dokumente abbildet und es erleichtert, Dokumente zu finden, in denen ein bestimmtes Wort vorkommt.
- Wenn ein Nutzer eine Suchanfrage stellt, wird der invertierte Index verwendet, um alle Dokumente zu finden, die zu den Keywords der Anfrage passen.
- Die Logik des invertierten Indexes ist in einer Klasse namens
SearchEngine definiert und wird durch die Initialisierung von zwei Dictionaries umgesetzt.
Ranking
- Wenn es für eine gegebene Anfrage eine Menge passender Dokumente gibt, braucht man eine Methode, um diese zu sortieren.
- Die bekannteste Ranking-Methode ist Googles PageRank, aber es gibt auch andere Optionen wie BM25, das Dokumente auf Basis ihres Inhalts bewertet.
- Es werden die fehlenden Teile der Klasse
SearchEngine implementiert, einschließlich der Methode zur Berechnung des BM25-Scores.
Interface
- Nachdem die Suchmaschine gebaut wurde, wollte der Autor sie in irgendeiner Form veröffentlichen.
- Dazu wurde eine FastAPI-App erstellt, die einen Endpoint zum Bereitstellen der Suchmaschine anbietet und eine einfache Webseite rendert, auf der gesucht werden kann.
- Damit die Ausgabe leicht lesbar bleibt, wurde entschieden, nur die Top-N-URLs auszuwählen.
Fehlende Funktionen
- Leser, die häufig mit Suchmaschinen arbeiten, werden feststellen, dass in der Implementierung viele Funktionen fehlen.
- Es fehlen unter anderem Query-Operatoren, n-Gram-Indexierung, Query- oder Dokumenterweiterung sowie die Möglichkeit, Crawling und Indexierung gleichzeitig auszuführen.
Fazit
- Durch dieses Projekt gewann der Autor ein besseres Verständnis dafür, wie Solr intern funktioniert, und lernte die Vorzüge von asynchronem Code kennen.
- Als nächsten Schritt beim Bau einer persönlichen Suchmaschine plant er, eine semantische Suche in die Suchmaschine zu integrieren.
Meinung von GN⁺
- Das Wichtigste an diesem Artikel ist, dass Einzelpersonen selbst eine Suchmaschine bauen können, um die Auffindbarkeit kleiner Websites zu verbessern.
- Die Erfahrung, mit Python und Open-Source-Bibliotheken eine Suchmaschine mit komplexen Funktionen in vereinfachter Form umzusetzen, kann auch Einsteigerinnen und Einsteiger im Software Engineering inspirieren.
- Indem der Artikel anhand eines praktischen Beispiels die Effizienz asynchroner Programmierung und die Bedeutung von Datenstrukturen zeigt, bietet er sowohl technische Einblicke als auch eine praktische Lerngelegenheit.
1 Kommentare
Hacker-News-Kommentare
Entwicklung einer BM25-Suchmaschine mit Pandas
Code-Review: Klasse
SearchEnginek1undbbedeuten, und der Code enthält überhaupt keine Kommentare._documentsURLs als Schlüssel und den Inhalt der jeweiligen URL als Wert.Die Komplexität von Suchmaschinen
Meinungen zur Zeilenzahl von Code
Scherz über eine Formulierung im Code
chunk for chunk in chunks if chunkim Code fällt jemandem ein Witz über einen Holzfäller ein.Beispielcode für eine Empfehlungsmaschine
Leistungsvergleich von Parsing-Bibliotheken
lxml.htmlundlxml.html.cleandeutlich schneller sein können alsBeautifulSoup.Ratschläge zur Verwendung von Keywords
Meinung zu einem lehrreichen Projekt
Zweifel an Python für die Verarbeitung großer Datenmengen