Est-il possible de développer un puissant moteur de recherche sur le Web en utilisant Erlang, Mnesia & amp; Pian?

StackOverflow https://stackoverflow.com/questions/195809

Question

Je songe à développer un moteur de recherche sur le Web utilisant Erlang, Mnesia & amp; Pian. Est-il possible de créer un moteur de recherche Web puissant et rapide avec ces logiciels? De quoi aura-t-il besoin pour accomplir cela et comment dois-je commencer?

Était-ce utile?

La solution

Erlang est aujourd'hui le robot le plus puissant sur le Web. Laissez-moi vous guider à travers mon simple robot.

Étape 1. Je crée un module de parallélisme simple, que j'appelle mapreduce

-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))}.

Étape 2. Le client HTTP

On utiliserait normalement le inets httpc module intégré à erlang ou le ibrowse . . Cependant, pour la gestion de la mémoire et la rapidité (obtenir le minimum de la mémoire), un bon programmeur erlang choisirait d'utiliser curl . En appliquant le os: cmd / 1 qui prend cette ligne de commande curl, on obtiendrait la sortie directement dans la fonction d’appel erlang. Néanmoins, il est préférable de faire en sorte que curl jette ses sorties dans des fichiers, puis notre application utilise un autre thread (processus) qui lit et analyse ces fichiers

Command: 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\"").
afin que vous puissiez générer de nombreux processus. Vous vous souvenez d'échapper à l'URL ainsi qu'au chemin du fichier de sortie lorsque vous exécutez cette commande. Il existe par contre un processus dont le travail consiste à regarder le répertoire des pages téléchargées. Ces pages qu'il lit et analyse, il peut ensuite supprimer après analyse ou enregistrer dans un emplacement différent, voire mieux, les archiver à l'aide du module zip
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).

Étape 3. L’analyseur HTML.
Mieux vaut utiliser ce html de mochiweb analyseur et XPATH . Cela vous aidera à analyser et à obtenir toutes vos balises HTML préférées, à extraire le contenu et à commencer. Les exemples ci-dessous ne concernent que les Mots clés , description et titre dans le balisage.


Test de module en shell ... des résultats impressionnants !!!

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"}]


Vous pouvez maintenant vous rendre compte que nous pouvons indexer les pages en fonction de leurs mots-clés, ainsi qu’un bon calendrier de pages révisées. Un autre défi consistait à créer un robot d'exploration (quelque chose qui se déplacerait sur tout le Web, d'un domaine à l'autre), mais celui-ci est simple. C'est possible en analysant un fichier HTML pour les balises href. Faites en sorte que l’analyseur HTML extrait toutes les balises href. Vous aurez peut-être besoin d’expressions régulières ici et là pour obtenir les liens directement sous un domaine donné.

Exécution du robot

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
Stockage: est l'un des concepts les plus importants pour un moteur de recherche. C'est une grosse erreur de stocker les données d'un moteur de recherche dans un SGBDR tel que MySQL, Oracle, MS SQL, etc. Ces systèmes sont complètement complexes et les applications qui les interfacent utilisent des algorithmes heuristiques. Cela nous amène aux magasins de valeurs-clés , dont les deux suivants: Mes meilleurs sont serveur de base Couch et Riak . Ce sont d'excellents systèmes de fichiers Cloud. Un autre paramètre important est la mise en cache. La mise en cache est réalisée en utilisant Memcached , dont les deux autres Les systèmes de stockage mentionnés ci-dessus sont pris en charge. Les systèmes de stockage pour les moteurs de recherche doivent être SGBD sans schéma , qui se concentre sur la Disponibilité plutôt que sur la cohérence . En savoir plus sur les moteurs de recherche à partir d'ici: http://fr.wikipedia.org/wiki/Web_search_engine

Autres conseils

Autant que je sache, le moteur de recherche du traitement en langage naturel de Powerset est développé à l'aide de erlang.

Avez-vous considéré couchdb (également écrit en erlang) comme outil possible pour vous aider à résoudre quelques problèmes sur votre chemin?

Je recommanderais CouchDB au lieu de Mnesia.

YAWS est très bon. Vous devriez également envisager MochiWeb.

Vous n'allez pas vous tromper avec Erlang

Dans la la contribution 'rdbms' , il existe une implémentation de l’algorithme de Porter Stemming. Il n'a jamais été intégré à 'rdbms', donc c'est simplement rester là. Nous l'avons utilisé en interne, et cela a très bien fonctionné, du moins pour les ensembles de données qui n'étaient pas énormes (je ne l'ai pas testé sur d'énormes volumes de données).

Les modules pertinents sont les suivants:

rdbms_wsearch.erl
rdbms_wsearch_idx.erl
rdbms_wsearch_porter.erl

Ensuite, il existe bien sûr le cadre Disco Map-Réduire .

Je ne saurais dire si vous pouvez fabriquer le moteur le plus rapide du marché. Existe-t-il un marché pour un moteur de recherche plus rapide ? Je n'ai jamais eu de problèmes de vitesse, par exemple. Google. Mais un outil de recherche qui augmenterait mes chances de trouver de bonnes réponses à mes questions m'intéresserait.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top