Pregunta

Estoy pensando en desarrollar un motor de búsqueda web usando Erlang, Mnesia & amp; Pian. ¿Es posible hacer un motor de búsqueda web potente y más rápido utilizando este software? ¿Qué necesitará para lograr esto y cómo empiezo?

¿Fue útil?

Solución

Erlang puede hacer el rastreador web más poderoso de la actualidad. Déjame llevarte a través de mi simple rastreador.

Paso 1. Creo un módulo de paralelismo simple, al que llamo 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))}.

Paso 2. El cliente HTTP

Normalmente se usaría el inets httpc module integrado en erlang o ibrowse . Sin embargo, para la gestión de la memoria y la velocidad (obtener la huella de memoria lo más baja posible), un buen programador de erlang elegiría usar curl . Al aplicar el os: cmd / 1 que toma esa línea de comando curl, uno obtendría la salida directamente en la función de llamada erlang. Sin embargo, es mejor hacer que curl arroje sus salidas a archivos y luego nuestra aplicación tenga otro hilo (proceso) que lea y analice estos archivos

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\"").
para que pueda generar muchos procesos. Recuerda escapar de la URL y de la ruta del archivo de salida mientras ejecuta ese comando. Hay un proceso por otro lado cuyo trabajo es mirar el directorio de páginas descargadas. Estas páginas las lee y analiza, luego puede eliminarlas después de analizarlas o guardarlas en una ubicación diferente o incluso mejor, archivarlas usando el 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).

Paso 3. El analizador html.
Mejor use este mochiweb's html analizador y XPATH . Esto lo ayudará a analizar y obtener todas sus etiquetas HTML favoritas, extraer el contenido y listo. En los ejemplos a continuación, me concentré solo en las Palabras clave , descripción y title en el marcado


Pruebas de módulo en shell ... ¡resultados increíbles!

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


Ahora puede darse cuenta de que podemos indexar las páginas con sus palabras clave, además de un buen calendario de revisores de páginas. Otro desafío fue cómo hacer un rastreador (algo que se moverá por toda la web, de dominio a dominio), pero ese es fácil. Es posible analizando un archivo Html para las etiquetas href. Haga que el Analizador HTML extraiga todas las etiquetas href y luego puede necesitar algunas expresiones regulares aquí y allá para obtener los enlaces directamente en un dominio determinado.

Ejecutar el rastreador

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
Almacenamiento : es uno de los conceptos más importantes para un motor de búsqueda. Es un gran error almacenar datos del motor de búsqueda en un RDBMS como MySQL, Oracle, MS SQL e.t.c. Dichos sistemas son completamente complejos y las aplicaciones que interactúan con ellos emplean algoritmos heurísticos. Esto nos lleva a Key-Value Stores , de los cuales los dos mis mejores son Couch Base Server y Riak . Estos son excelentes sistemas de archivos en la nube. Otro parámetro importante es el almacenamiento en caché. El almacenamiento en caché se obtiene utilizando say Memcached , de los cuales los otros dos los sistemas de almacenamiento mencionados anteriormente tienen soporte para ello. Los sistemas de almacenamiento para motores de búsqueda deben ser DBMS sin esquema , que se enfoca en Disponibilidad más que en Consistencia . Lea más sobre los motores de búsqueda desde aquí: http://en.wikipedia.org/wiki/Web_search_engine

Otros consejos

Hasta donde yo sé El motor de búsqueda de procesamiento de lenguaje natural de Powerset se desarrolla utilizando erlang.

¿Viste couchdb (que también está escrito en erlang) como una posible herramienta para ayudarte a resolver algunos problemas en tu camino?

Recomendaría CouchDB en lugar de Mnesia.

YAWS es bastante bueno. También debe considerar MochiWeb.

No te equivocarás con Erlang

En el 'rdbms' contrib , hay una implementación del algoritmo de simulación de porter. Nunca se integró en 'rdbms', por lo que básicamente solo está ahí afuera. Lo hemos usado internamente y funcionó bastante bien, al menos para conjuntos de datos que no eran enormes (no lo he probado en grandes volúmenes de datos).

Los módulos relevantes son:

rdbms_wsearch.erl
rdbms_wsearch_idx.erl
rdbms_wsearch_porter.erl

Luego está, por supuesto, el Marco de Disco Map-Reduce .

No puedo decir si puedes hacer el motor más rápido o no. ¿Existe un mercado para un motor de búsqueda más rápido ? Nunca he tenido problemas con la velocidad de p. Google Pero un servicio de búsqueda que aumentara mis posibilidades de encontrar buenas respuestas a mis preguntas me interesaría.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top