Jimmy: Suchmachinen Programmieren ?

Ich weiss nicht ob die Frage hier richtig aufgehoben ist,
ich frag einfach mal okay ?

Ich würde gerne mein Wissen erweitern und lernen wie man eine Suchmachine selber programmiert, und wenns auch nur kleinigkeiten sind ums erstmal auszuprobieren .

Hat einer von euch ne Idee wo ich gute Tutorials dazu finden kann ?

Danke
Jimmy

  1. Ich weiss nicht ob die Frage hier richtig aufgehoben ist,
    ich frag einfach mal okay ?

    Klar!

    Ich würde gerne mein Wissen erweitern und lernen wie man eine Suchmachine selber programmiert, und wenns auch nur kleinigkeiten sind ums erstmal auszuprobieren .

    Versuche zunächst mal zu verstehen, was eine Suchmaschine eigentlich ist bzw. was sie macht.
    Sie besteht ja aus zwei Teilen, dem Roboter/Crawler, der die Seiten erfaßt und der eigentlichen Suchmaschine (was die meisten so darunter verstehen), die eine Datenbankabfrage ermöglicht, um das zu durchforsten, was der kleine, oft wenig beachtete Crawler vorher gefunden hat.

    Ich kann Dir nur Tips für Perl geben, aber wie oben angedeutet, ist die Sprache eher zweitrangig!
    Zunächst baue etwas, was eine Seite holt. Dann versuche Links aufzulösen, um Dich durch den Seitenbaum zu hangeln.
    Das wäre der erste Schritt.

    Nächste Überlegung wäre, wie man den Quelltext weiter verarbeitet, d.h. speichert. Sollte man z.B. alle Tags rausschmeißen?
    Braucht man eine Datenbank oder reicht (für Versuche) ein Textfile?

    Um zu sehen, wie der Crawler Deine Seiten erfaßt, kannst Du Dir mal unsere Kiste ansehen, wie sie nach und nach Seiten erfaßt.
    Bei größeren Sites kannst Du das online fast mitverfolgen, bei kleinen ist sie wahrscheinlich fertig, bevor Du Deine Zugangsdaten per Mail erhalten hast.
    ->http://www.w3sitesearch.de

    Gruß
    Reiner

    1. Hi,

      Versuche zunächst mal zu verstehen, was eine Suchmaschine eigentlich ist bzw. was sie macht. Sie besteht ja aus zwei Teilen, dem Roboter/Crawler, der die Seiten erfaßt

      Dazu kannst Du am Anfang einfach 'wget' o.ä. nutzen, das würde ich nicht auch noch basteln. Man sollte sich immer nur auf eine Baustelle beschränken, glaub's mir ;-)

      und der eigentlichen Suchmaschine (was die meisten so darunter verstehen), die eine Datenbankabfrage ermöglicht, um das zu durchforsten, was der kleine, oft wenig beachtete Crawler vorher gefunden hat.

      Hier ist der interessanteste Teil: die Aufbereitung der Daten. Die Frage lautet: was gedenkst Du finden zu wollen? Alldieweil Du überlegst:"Hä? Was will der Kerl von mir?" ein paar kleine Tips:

      • Je kleiner der Heuhaufen, desto eher findet man die Nadel.

      Sowas schimpft sich Datenreduktion, aber auch nur, weil es sich besser anhört als Heuhaufen. Hierzu gehört z.B. alles, was Du nicht finden möchtest. Z.B. so Worte wie "und, oder, der, die, das, ist, ein ...". Sowas nennt man eine Stopwortliste. Die wurde schon von anderen zusammengstellt und findet sich unter o.a. Stichwort und dessen Variationen im Netz. Dann hast Du noch, wie Reiner schon so trefflich erwähnte, einige die Informationsmenge nicht wesentlich vergrößernde Daten wie z.B. HTML-Elemente und anderes Markup. Meistens gibt es zum entfernen solchen "Mülls" bereits fertige Programme (Bei HTML: "alles zwischen '<' und '>' einschließlich entfernen" funktioniert nicht!). Dann hast Du noch die Möglichkeit die auf Suffix-flexion basierende indogermanische Grammatik zu nutzen und alle Wörter auf die Stammformen zurückzuführen ("Stemming" genannt). Aber das gehört eigentlich schon zum zweiten Punkt:

      • je mehr Du finden möchtest, desto komplizierter wird es.

      Was? Ich wäre ein blöder Hund, das weiß doch jeder? Nun, ganz so einfach wie sich das anhört ist nicht. Die einfachste Methode ist die, alle Daten festzuhalten und dann Volltext zu durchsuchen. das ist nicht nur die langsamste Methode mit dem größtem Speicherverbrauch sondern sie findet auch nicht alles. Alleine durch das fehlende Stemming kann es sein, das Du bestimmte Worte nicht findest. So kann es sein, das Du nach "Weg" suchst, aber nichts findest, weil alle nur "des Weges kamen". (Ein selten dämliches Beispiel, gebe ich ja ehrlich zu ;-) Die Volletxtsuche hat aber auch ein paar Vorteile (simple Phrasensuche, Regular Expressions etc, das bei anderen Methoden erheblichen Aufwand bei der Implemenation benötigt), die jedoch nur nützlich sind, wenn der Platz für die Datenhaltung tatsächlich vorhanden ist. Je nach Datenbank wird dafür auch ein wenig Service geboten (Indexing et al), sodaß die Geschwindigkeit nicht allzusehr leidet. Dafür wird dann aber auch wieder Platz benötigt. Es ist insgesammt ein sehr weites Feld, da hat sich manch einer mit habilitiert ;-)

      Ein ganz guter Kompromis ist aber folgende Vorgehensweise: (Pro eingehende Datei)

      1. Pfad merken (ich sag's lieber nochmal extra ;-)
      2. die Eingangsdaten werden von Markup gesäubert.    Dazu gehört auch die Umwandlung von Entities und    Umwandlung in eine einheitliche Zeichenkodebasis.
      3. Alle Worte werden voneinander getrennt und:    a) alles in Kleinbuchstaben gesetzt    b) alle Stopwörter entfernt    c) gestemmt    d) sortiert    e) alle Doppelten rausgeschmissen
      4. An diese Worte werden die entsprechenden Pfade angehangen.
      5. Diese Wort-Pfad Einheiten werden in eine Datenbank gepackt    und zwar mit folgender Logik:    Wenn das Wort bereits in der Datenbank:      hänge den Pfad an den Datenbankeintrag zum Wort an    Sonst      packe Wort-Pfad Einheit in die Datenbank
      6. Nutze die Angebote der Datenbank die Suche zu    beschleunigen (Indexing etc) aber fummel Dir keinen    ab dabei, das lohnt nicht.

      Das ist Dein Grundgerüst, ein sogenannter "inverted index", so machen es fast alle, so funktioniert im Prinzip sogar Google, auch wenn das da nur noch schlecht erkennbar ist. Die ganzen Tricks von Google liegen in der Datenaufbereitung, also das, was vorher passiert und der Datenhaltung, die aber anwendungsneutral ist. Das heißt natürlich auch, das Du sobald das Grundgerüst steht anfangen kannst Erweiterungen einzubauen. So kannst Du eine einfache Gewichtung einbauen: wie oft kommt das Wort in der Datei vor? Du kannst eine Art Googleranking einbauen, eine Rechtschreibprüfung, Phrasensuche, einfache Logik (AND, OR, NOT usw), Regexe und noch vieles mehr.

      Ein Sicherheitshinweis noch:

      Gecrawlt wird immer nur von außen! D.h. statt durch /usr/local/httpd/htdocs zu wandern und dabei einiges in den Index aufzunehmen, das der Öffentlichkeit verborgen bleiben soll fängst Du von außen an: bei http://www.example.com/. Wenn Du dann auf geschützte Bereiche kommst, kommt Dein Crawler nicht weiter. Ebenfalls bleiben so nicht über http://www.example.com/ verlinkte Seiten unerfaßt.

      Von außen sieht es nach viel Aufwand und Komplexität aus, aber die einzelnen Schritte sind recht einfach zu implementieren, das Grundgerüst solltest Du schnell stehen haben. Für den Crawler würde ich mir wie gesagt etwas fertiges nehmen. Den zu bauen ist reine Fleißarbeit und wenig erquicklich.

      so short

      Christoph Zurnieden