2013-07-21 10 views
8

Dies ist nicht das erste Mal, dass diese Frage bei Stackoverflow asked ist - aber es ist fast fünf Jahre später - und die Zeiten und Technologien haben sich ein wenig verändert. Ich frage mich, was die Leute heutzutage über den Aufbau einer Suchmaschine denken?Wie erstelle ich eine Suchmaschine? (2013 Update)

Zum Beispiel, ich weiß Nutch wird weiter entwickelt - 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, was die Notwendigkeit verringert, das eigene Spidering von Common Crawl durchzuführen.

Es gibt natürlich noch ein paar benutzerdefinierte Suchmaschinen-Lösungen, am bekanntesten ist Google's CSE ... aber ich kenne keine anderen großen/stabilen/seriösen, die ich bauen würde ein Motor auf?

Welche Ressourcen sind jetzt verfügbar, um Programmier-Suchmaschinen zu lernen, die vor ein paar Jahren noch nicht einmal im letzten Jahr verfügbar waren?

Antwort

1

ich diese Frage verwenden, werden eine kleine Suchmaschine einige Erfahrung zu teilen von Grund auf neu zu schreiben (kein Suchspezifische Bibliotheken wurden verwendet) für einen ziemlich kleinen Datensatz (es sucht tatsächlich stackoverflow, da es weder zu klein noch zu groß war, um auf einem einzelnen Server zu arbeiten). Check it out. 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 nicht zu vergessen SSD-Festplatten!

Also, alles in allem kriechen die meisten Stackoverflow (~ 13 000 000 Seiten) auf diese Weise mit einer Maschine (4 GB RAM) dauert etwa 2 Monate. Und die resultierenden Daten (der invertierte Index, der rohe bereinigte Text usw.) - etwa 80 GB Speicherplatz.

Suche

Das Ziel ist es, schnell und mit hohen Qualität zu tun. 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 es.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!

Verwandte Themen