Wie erstelle ich eine Suchmaschine? (Aktualisierung 2013)

8

Dies ist nicht das erste Mal, dass diese Frage gestellt wurde hier bei Stackoverflow - aber es ist fast fünf Jahre später - und die Zeiten und Technologien haben sich ein wenig verändert. Ich frage mich, was Leute heutzutage denken über den Aufbau einer Suchmaschine?

Zum Beispiel weiß ich, dass weiterhin entwickelt wird - aber ist es immer noch die robusteste verfügbare Lösung? Sind alternative Lösungen für andere Sprachen verfügbar - z. C #, PHP, VB.NET?

Ich weiß auch, dass es jetzt einen öffentlich verfügbaren Massenindex gibt, der genutzt werden kann, wodurch die Notwendigkeit verringert wird, das eigene Spidering von Common Crawl .

Natürlich gibt es noch ein paar benutzerdefinierte Suchmaschinen-Lösungen, von denen die meisten bekannt sind Google's CSE . .aber mir sind keine anderen großen / stabilen / seriösen bekannt, denen ich vertrauen würde, um eine Maschine auf zu bauen?

Welche Ressourcen sind jetzt verfügbar, um Programmier-Suchmaschinen zu lernen, die vor ein paar Jahren oder sogar letztes Jahr nicht verfügbar waren?

    
davemackey 21.07.2013, 22:07
quelle

2 Antworten

1

Udacity hat einen sehr guten Kurs zum Erlernen von Python über das Erstellen eines Web-Crawlers, versuchen Sie es hier: Ссылка

    
jantar 24.08.2013 11:17
quelle
1

Ich werde diese Frage verwenden, um einige Erfahrungen beim Schreiben einer kleinen Suchmaschine von Grund auf zu teilen (es wurden keine suchspezifischen Bibliotheken verwendet) für einen ziemlich kleinen Datensatz (es sucht tatsächlich stackoverflow, da es weder zu klein noch zu groß ist arbeiten auf einem einzelnen Server). Schau es dir an . Unten sind meine Ergebnisse zu dem Thema.

Crawler

Erstens ist der Crawler eine schwierige Sache zu tun. Das eigentliche Problem ist das Schreiben von Daten auf die Festplatte so schnell wie Sie die Webseiten erhalten. Die Hauptdatenstruktur ist ein umgekehrter Index. Wenn Sie also das Wort "Banane" erhalten, müssen Sie den Index "Banane" (Liste der Dokumente, an denen er auftritt - zusammen mit den Positionen im Dokument) vom neuen Datensatz anhängen und schreibe es zurück. Wenn die Liste wächst, wird das Ziehen und Schreiben langsamer. Ein Trick wäre also, die invertierten Indizes (und die Dokumente) in Partitionen zu zerlegen, sagen 1-1000 Dokumente in der ersten Partition und so weiter. Der andere "Trick" ist das Crawlen einer Partition, um Indizes im Speicher zu behalten und sie nur dann auf die Festplatte zu spülen, wenn die Partition fertig ist.

Wichtiges Bit: Was zum Speichern der Daten verwenden? Es gibt viele Möglichkeiten und nach vielen Experimenten habe ich leveldb als die beste Wahl für heute gefunden. Und vergessen Sie nicht SSD-Festplatten!

Alles in allem dauert das Crawlen des Stack-Overflows (~ 13 000 000 Seiten) auf diese Weise mit einer Maschine (4 GB RAM) etwa 2 Monate. Und die resultierenden Daten (der invertierte Index, der rohe bereinigte Text usw.) - ungefähr 80 GB Speicherplatz.

Suche

Das Ziel ist, es schnell und mit hoher Qualität zu machen. Wenn Sie möchten, dass es schnell geht, können Sie nicht den gesamten Datensatz durchsuchen. Zum Glück hatte ich alles partitioniert, so dass die Suche die ersten 100 Partitionen annimmt, wo die Schlüsselwörter erscheinen (separater Index dafür) und wenn sie "gut genug" Ergebnisse findet - stoppt, wenn nicht - nimmt weitere 100 und so weiter.

Der langsamste Teil liest Indizes von der Festplatte und deserialisiert sie. Leveldb unterstützt schnelles sequentielles Lesen, daher müssen die Daten so gespeichert werden, dass die meisten davon sequenziell gelesen werden können. Einmal im Speicher ist die Schnittmenge ziemlich schnell.

Jetzt die Qualität. Das ist das härteste und nie gut genug. Mein erster Versuch war, invertierte Indizes nicht nur für den Text, sondern auch für die Titel, Linktexte und URLs zu behalten. Jeder Treffer fügt dem Dokument einige Punkte hinzu. Eine andere Sache ist, die Abfrage mit Synonymen umzuformulieren und irgendwie zu überprüfen, welche Abfrage am besten funktioniert. Das würde wahrscheinlich einen eigenen Beitrag verdienen.

Wie auch immer, ich hoffe, es wird nützlich sein zu lesen!

    
ren 02.09.2015 20:56
quelle