Frage

Ich denke darüber nach, eine Websuchmaschine mit Erlang, Mnesia und Yaws zu entwickeln.Ist es möglich, mit dieser Software eine leistungsstarke und schnellste Websuchmaschine zu erstellen?Was wird benötigt, um dies zu erreichen, und wie fange ich damit an?

War es hilfreich?

Lösung

Erlang kann heute den leistungsstärksten Webcrawler erstellen.Lassen Sie mich Sie durch meinen einfachen Crawler führen.

Schritt 1.Ich erstelle ein einfaches Parallelitätsmodul, das ich aufrufe Karte verkleinern

-module(mapreduce).
-export([compute/2]).
%%=====================================================================
%% usage example
%% Module = string
%% Function = tokens
%% List_of_arg_lists = [["file\r\nfile","\r\n"],["muzaaya_joshua","_"]]
%% Ans = [["file","file"],["muzaaya","joshua"]]
%% Job being done by two processes
%% i.e no. of processes spawned = length(List_of_arg_lists)

compute({Module,Function},List_of_arg_lists)->
    S = self(),
    Ref = erlang:make_ref(),
    PJob = fun(Arg_list) -> erlang:apply(Module,Function,Arg_list) end,
    Spawn_job = fun(Arg_list) -> 
                    spawn(fun() -> execute(S,Ref,PJob,Arg_list) end)
                end,
    lists:foreach(Spawn_job,List_of_arg_lists),
    gather(length(List_of_arg_lists),Ref,[]).
gather(0, _, L) -> L; gather(N, Ref, L) -> receive {Ref,{'EXIT',_}} -> gather(N-1,Ref,L); {Ref, Result} -> gather(N-1, Ref, [Result|L]) end.
execute(Parent,Ref,Fun,Arg)-> Parent ! {Ref,(catch Fun(Arg))}.

Schritt 2. Der HTTP-Client

Normalerweise würde man beides verwenden inets httpc module eingebaut in Erlang oder ibrowse.Aus Gründen der Speicherverwaltung und der Geschwindigkeit (um den Speicherbedarf so gering wie möglich zu halten) würde sich ein guter Erlang-Programmierer jedoch für die Verwendung entscheiden Locken.Durch die Anwendung der os:cmd/1 Wenn man diese Curl-Befehlszeile verwendet, erhält man die Ausgabe direkt in die Erlang-Aufruffunktion.Dennoch ist es besser, Curl dazu zu bringen, seine Ausgaben in Dateien zu werfen, und dann verfügt unsere Anwendung über einen anderen Thread (Prozess), der diese Dateien liest und analysiert

Befehl: curl "http://www.erlang.org" -o "/downloaded_sites/erlang/file1.html"
In Erlang
os:cmd("curl \"http://www.erlang.org\" -o \"/downloaded_sites/erlang/file1.html\"").
So können Sie viele Prozesse starten.Denken Sie daran, beim Ausführen dieses Befehls sowohl die URL als auch den Pfad der Ausgabedatei mit Escapezeichen zu versehen.Andererseits gibt es einen Prozess, dessen Aufgabe darin besteht, das Verzeichnis der heruntergeladenen Seiten zu überwachen.Diese Seiten werden gelesen und analysiert. Anschließend kann es nach dem Parsen gelöscht oder an einem anderen Ort gespeichert oder, noch besser, mit dem archiviert werden zip module
folder_check()->
    spawn(fun() -> check_and_report() end),
    ok.

-define(CHECK_INTERVAL,5).

check_and_report()->
    %% avoid using
    %% filelib:list_dir/1
    %% if files are many, memory !!!
    case os:cmd("ls | wc -l") of
        "0\n" -> ok;
        "0" -> ok;
        _ -> ?MODULE:new_files_found()
    end,
    sleep(timer:seconds(?CHECK_INTERVAL)),
    %% keep checking
    check_and_report().

new_files_found()->
    %% inform our parser to pick files
    %% once it parses a file, it has to 
    %% delete it or save it some
    %% where else
    gen_server:cast(?MODULE,files_detected).

Schritt 3. Der HTML-Parser.
Nutzen Sie das besser Mochiwebs HTML-Parser und XPATH.Dies wird Ihnen helfen, alle Ihre bevorzugten HTML-Tags zu analysieren und abzurufen, den Inhalt zu extrahieren und dann kann es losgehen.Bei den folgenden Beispielen habe ich mich nur auf die folgenden konzentriert Keywords, description Und title im Markup


Modultests in der Shell...tolle Ergebnisse!!!

2> spider_bot:parse_url("http://erlang.org").
[[[],[],
  {"keywords",
   "erlang, functional, programming, fault-tolerant, distributed, multi-platform, portable, software, multi-core, smp, concurrency "},
  {"description","open-source erlang official website"}],
 {title,"erlang programming language, official website"}]

3> spider_bot:parse_url("http://facebook.com").
[[{"description",
   " facebook is a social utility that connects people with friends and others who work, study and live around them. people use facebook to keep up with friends, upload an unlimited number of photos, post links
 and videos, and learn more about the people they meet."},
  {"robots","noodp,noydir"},
    [],[],[],[]],
 {title,"incompatible browser | facebook"}]

4> spider_bot:parse_url("http://python.org").
[[{"description",
   "      home page for python, an interpreted, interactive, object-oriented, extensible\n      programming language. it provides an extraordinary combination of clarity and\n      versatility, and is free and
comprehensively ported."},
  {"keywords",
   "python programming language object oriented web free source"},
  []],
 {title,"python programming language – official website"}]

5> spider_bot:parse_url("http://www.house.gov/").
[[[],[],[],
  {"description",
   "home page of the united states house of representatives"},
  {"description",
   "home page of the united states house of representatives"},
  [],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],
  [],[],[]|...],
 {title,"united states house of representatives, 111th congress, 2nd session"}]


Das können Sie jetzt erkennen: Wir können die Seiten anhand ihrer Schlüsselwörter indizieren und einen guten Zeitplan für Seitenüberarbeitungen erstellen.Eine weitere Herausforderung bestand darin, einen Crawler zu erstellen (etwas, das sich im gesamten Web von Domain zu Domain bewegt), aber das ist einfach.Dies ist möglich, indem eine HTML-Datei nach den href-Tags analysiert wird.Lassen Sie den HTML-Parser alle href-Tags extrahieren. Anschließend benötigen Sie möglicherweise hier und da einige reguläre Ausdrücke, um die Links direkt unter einer bestimmten Domain anzuzeigen.

Den Crawler ausführen

7> spider_connect:conn2("http://erlang.org").        

        Links: ["http://www.erlang.org/index.html",
                "http://www.erlang.org/rss.xml",
                "http://erlang.org/index.html","http://erlang.org/about.html",
                "http://erlang.org/download.html",
                "http://erlang.org/links.html","http://erlang.org/faq.html",
                "http://erlang.org/eep.html",
                "http://erlang.org/starting.html",
                "http://erlang.org/doc.html",
                "http://erlang.org/examples.html",
                "http://erlang.org/user.html",
                "http://erlang.org/mirrors.html",
                "http://www.pragprog.com/titles/jaerlang/programming-erlang",
                "http://oreilly.com/catalog/9780596518189",
                "http://erlang.org/download.html",
                "http://www.erlang-factory.com/conference/ErlangUserConference2010/speakers",
                "http://erlang.org/download/otp_src_R14B.readme",
                "http://erlang.org/download.html",
                "https://www.erlang-factory.com/conference/ErlangUserConference2010/register",
                "http://www.erlang-factory.com/conference/ErlangUserConference2010/submit_talk",
                "http://www.erlang.org/workshop/2010/",
                "http://erlangcamp.com","http://manning.com/logan",
                "http://erlangcamp.com","http://twitter.com/erlangcamp",
                "http://www.erlang-factory.com/conference/London2010/speakers/joearmstrong/",
                "http://www.erlang-factory.com/conference/London2010/speakers/RobertVirding/",
                "http://www.erlang-factory.com/conference/London2010/speakers/MartinOdersky/",
                "http://www.erlang-factory.com/",
                "http://erlang.org/download/otp_src_R14A.readme",
                "http://erlang.org/download.html",
                "http://www.erlang-factory.com/conference/London2010",
                "http://github.com/erlang/otp",
                "http://erlang.org/download.html",
                "http://erlang.org/doc/man/erl_nif.html",
                "http://github.com/erlang/otp",
                "http://erlang.org/download.html",
                "http://www.erlang-factory.com/conference/ErlangUserConference2009",
                "http://erlang.org/doc/efficiency_guide/drivers.html",
                "http://erlang.org/download.html",
                "http://erlang.org/workshop/2009/index.html",
                "http://groups.google.com/group/erlang-programming",
                "http://www.erlang.org/eeps/eep-0010.html",
                "http://erlang.org/download/otp_src_R13B.readme",
                "http://erlang.org/download.html",
                "http://oreilly.com/catalog/9780596518189",
                "http://www.erlang-factory.com",
                "http://www.manning.com/logan",
                "http://www.erlang.se/euc/08/index.html",
                "http://erlang.org/download/otp_src_R12B-5.readme",
                "http://erlang.org/download.html",
                "http://erlang.org/workshop/2008/index.html",
                "http://www.erlang-exchange.com",
                "http://erlang.org/doc/highlights.html",
                "http://www.erlang.se/euc/07/",
                "http://www.erlang.se/workshop/2007/",
                "http://erlang.org/eep.html",
                "http://erlang.org/download/otp_src_R11B-5.readme",
                "http://pragmaticprogrammer.com/titles/jaerlang/index.html",
                "http://erlang.org/project/test_server",
                "http://erlang.org/download-stats/",
                "http://erlang.org/user.html#smtp_client-1.0",
                "http://erlang.org/user.html#xmlrpc-1.13",
                "http://erlang.org/EPLICENSE",
                "http://erlang.org/project/megaco/",
                "http://www.erlang-consulting.com/training_fs.html",
                "http://erlang.org/old_news.html"]
ok
Lagerung: Ist eines der wichtigsten Konzepte für eine Suchmaschine.Es ist ein großer Fehler, Suchmaschinendaten in einem RDBMS wie MySQL, Oracle, MS SQL usw. zu speichern.Solche Systeme sind völlig komplex und die Anwendungen, die mit ihnen interagieren, verwenden heuristische Algorithmen.Das bringt uns dazu Schlüsselwertspeicher, von denen die zwei meiner Besten sind Couch-Base-Server Und Riak.Das sind großartige Cloud-Dateisysteme.Ein weiterer wichtiger Parameter ist das Caching.Caching wird mit say erreicht Im Speicher gespeichert, von denen die anderen beiden oben genannten Speichersysteme dies unterstützen.Speichersysteme für Suchmaschinen sollten es sein schemaless DBMS,die sich darauf konzentriert Availability rather than Consistency.Lesen Sie hier mehr über Suchmaschinen: http://en.wikipedia.org/wiki/Web_search_engine

Andere Tipps

Soweit ich weiß, Powerset 's procesing Suchmaschine natürliche Sprache entwickelt wird mit erlang.

Haben schauen Sie auf couchdb (die auch in erlang geschrieben) als mögliches Werkzeug um Ihnen einige Probleme auf dem Weg zu lösen?

Ich würde empfehlen, CouchDB statt Mnesia.

Yaws ist ziemlich gut. Sie sollten auch MochiWeb berücksichtigen.

Sie werden nicht schief gehen mit Erlang

In der 'rdbms' contrib gibt es eine Implementierung des Porter Stemming-Algorithmus. Es wurde nie in ‚rdbms‘ integriert, so ist es im Grunde nur dort sitzen. Wir haben es intern verwendet, und es funktionierte recht gut, zumindest für Datensätze, die nicht sehr groß waren (ich habe es nicht auf große Datenmengen getestet).

Die entsprechenden Module sind:

rdbms_wsearch.erl
rdbms_wsearch_idx.erl
rdbms_wsearch_porter.erl

Dann gibt es natürlich die Disco Map-Reduce Rahmen .

Unabhängig davon, ob Sie den schnellsten Motor da draußen machen können, könnte ich nicht sagen. Gibt es einen Markt für eine schneller Suchmaschine? Ich hatte noch nie Probleme mit der Geschwindigkeit von z.B. Google. Aber eine Suchfunktion, die meine Chancen erhöht der Suche nach guten Antworten auf meine Fragen würde mich interessieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top