Ein paar Dinge die ich beim bauen des Index gelernt habe
Thomas Wölfer
11. April 2012
- Der in der Theorie einfachste Weg eine gute Suche zusammenzubasteln besteht darin, den Search Server (Express) zu verwenden. In der Praxis scheitert das aber daran, das das Ding praktisch nicht installiert werden kann.
- Ein weiterer einfacher Weg ist einfach die Volltextsuche vom SQL Server zu verwenden: Auch die Express-Variante hat einen Katalog für Volltextsuchen. Man braucht dann aber noch einen Spider, der die Webseiten einsammelt – und für ein paar tausend Seiten, so wie bei www.die.de, ist der SQL-Server meiner Ansicht nach ein bisschen übertrieben. Ein .net Dictionary tut es da auch.
- Für das Spidern der Webseiten kann man – auch wenn eigentlich alle Foren anderer Ansicht sind – prima das WebBrowser Control von .net verwenden: Woran offenbar irgendwie alle scheitern: Man muss an “passender” Stelle Application.DoEvents aufrufen. Damit kann man das Browser-Control auch ein einer Kommandozeilen-Anwendung verwenden. Wenn man das Control verwendet, dann hat man Vor- und Nachteile. Die Vorteile sind klar: Man bekommt Javascript redirects und sonstige Dinge die in der Webseite per Javscript passieren “umsonst”: Die ausgewertete Seite (die man einfach per DOM des Browsers auswerten kann) sieht (von der Struktur her betrachtet) genau so aus, wie sie auch im Browser aussehen würde. Wer sich nicht mit dem eher aufwendigeren auswerten des HTML auseinandersetzen will, der ist mit dem Control gut aufgehoben. Die Nachteile: Das ganze ist recht langsam, und man kann das Control nicht in mehreren parallel Threads verwenden. Ich habe das Control in der ersten Version meines Spiders verwendet, und das hat gut geklappt.
- Wer das Control nicht verwenden will – zum Beispiel weil man eben mehrere Threads (oder Tasks) braucht, der kann das Html Agility Pack verwenden. Das nehme ich in der aktuellen Version des Spiders: Man hat mehr Arbeit beim auswerten, aber die Sache geht dramatisch viel schneller. (Der erste Spider brauchte für www.die.de ca. 50 Minuten, meine aktuelle Variante braucht unter 2.)
- Hat man den Spider braucht man noch einen Index: Da kann man wie gesagt den Sql Server hernehmen, oder aber man steckt den Index einfach in ein paar Dictionaries. (Das mache ich.). Dazu ist es ganz gut zu wissen, das es den “Porter Stemmer” Algorithmus gibt. Der führt im Prinzip beliebige Worte in eine “Grundform” über. Das ist dafür gut, damit man zum Beispiel auch das Wort “Preis” findet, wenn “Preise” gesucht wurden. Vom Algorithmus gibt es fertige Implementierungen auch in C#.
- Im Gegensatz zum Download/Html auswerten geht das indizieren so schnell, das es sich nicht lohnt, selbiges zu parallelisieren.
- Fürs vernünftige parallelisieren der Downloads braucht man den SerivcePointManager.
- Nach einer einigermaßen brauchbaren Filterung der Seiten und des Inhalts darauf (inklusive stemming) überrascht einen der geringe Umfang des dann resultierenden Kataloges: Im Fall von www.die.de sieht es so aus, das von ca. 12.000 Seiten “hinterher” gerade noch knapp 4500 Seiten übrigbleiben – und die haben auch noch unter 30.000 unterschiedliche Worte. Eigentlich wirklich nicht besonders viel. Dabei ist die Sache mit den Seiten sicherlich stark von der Webseite abhängig – im Fall von die.de kommen die “vielen unnützen” Seiten durch die diversen Übersichtsseiten der Blogs zustande. Was die Anzahl der Worte angeht: Ich habe das auch mit “anderen” Webseiten ausprobiert, und da sah die Sache ähnlich aus.
Unabhängig davon: Falls jemand Interesse an einem Spider/Indexer in C# für eine Suche auf der eigenen Asp.Net Webseite hat: Ping me