2008-10-12 14 views
5

Estoy pensando en desarrollar un motor de búsqueda web usando Erlang, Mnesia & Yaws. ¿Es posible crear un motor de búsqueda web poderoso y rápido usando este software? ¿Qué necesitará para lograr esto y cómo empiezo?¿Es posible desarrollar un poderoso motor de búsqueda web usando Erlang, Mnesia & Yaws?

+0

¿Usted está pidiendo esta pregunta, pensando que alguien ya lo ha hecho y tiene la experiencia que le diga? :) –

+0

Robert P! no es nada así;). En realidad, estoy usando estas langs. para el desarrollo de un producto en mi empresa. Básicamente, este trabajo de marco (erlang, mnesia y yaws) no se conoce aquí en la India. ¿Pero estaba pensando en desarrollar el motor de búsqueda por encima de estos idiomas pero no sé cómo reaccionaría? – iankits

Respuesta

18

Erlang puede hacer que el más potente rastreador web hoy en día. Déjame guiarte por mi simple rastreador.

Paso 1. crear un módulo paralelismo simple, que yo 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))}.

cliente Paso 2. El HTTP

Uno podría usar normalmente ya sea inets httpc module incorporada en Erlang o ibrowse . Sin embargo, para la administración de memoria y la velocidad (haciendo que la huella de memoria sea 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, se obtendría la salida directamente en la función de llamada erlang. Aún así, es mejor, para hacer que Curl arroje sus salidas en archivos y luego nuestra aplicación tiene otro hilo (proceso) que lee y analiza 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 engendrar muchos procesos.Recuerda escaparse tanto de la URL como de la ruta del archivo de salida al ejecutar ese comando. Por otro lado, hay un proceso cuyo trabajo es observar el directorio de las páginas descargadas. Estas páginas se lee y los analiza, se pueden eliminar entonces después del análisis o guardar en un lugar diferente o mejor aún, archivarlos mediante 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 uso este mochiweb's html parser and XPATH. Esto te ayudará a analizar y obtener todas tus etiquetas HTML favoritas, extraer los contenidos y luego ir por buen camino. Los ejemplos a continuación, me he centrado en sólo el Keywords, description y title en el marcado


prueba de módulos con cáscara ... resultados impresionantes !!!

 
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, nos puede indexar las páginas en contra de sus palabras clave, además de un buen horario de revisists página. Otro desafío fue cómo hacer un rastreador (algo que se moverá por toda la web, de un dominio a otro), pero ese es fácil. Es posible al analizar un archivo Html para las etiquetas href. Cree el analizador HTML para extraer todas las etiquetas href y, a continuación, puede necesitar algunas expresiones regulares aquí y allá para obtener los enlaces directamente bajo un dominio determinado.

Ejecución del 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 los 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 de 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 realiza usando, por ejemplo, Memcached, del cual los otros dos sistemas de almacenamiento mencionados anteriormente tienen soporte. Los sistemas de almacenamiento para los motores de búsqueda deben ser schemaless DBMS, que se centra en Availability rather than Consistency. Leer más en los motores de búsqueda desde aquí: http://en.wikipedia.org/wiki/Web_search_engine

+1

+1 ¡Gracias por compartir! – Jonas

+0

En el código anterior, he utilizado el módulo 're', expresiones regulares, pero ahora hay una forma mejor de analizar HTML utilizando la implementación' XPATH' en Erlang integrada en 'Mochiweb'. Siga esto: http://ppolv.wordpress.com/2008/05/09/fun-with-mochiwebs-html-parser-and-xpath/ –

+0

@MuzaayaJoshua ¡Muchas gracias por esta respuesta! Escribí una araña web en PHP hace un par de años. Sin embargo, ha crecido mucho más de lo que originalmente se pretendía, y ahora los recursos del servidor que necesita para funcionar correctamente son simplemente poco realistas. En casa consideramos reingeniería en Erlang o C, pero estamos muy interesados ​​en Erlang debido a sus beneficios de rendimiento y escalabilidad. ¿Tiene alguna comparación en cuanto a qué tan bien este rendimiento se compuso para la misma araña en otros idiomas? ¿Lo probaste en otros idiomas? ¿Cómo se compara si es así? – user658182

4

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

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

+0

Muchas gracias Dimus. Es realmente informativo y útil. ;) – iankits

1

En el 'rdbms' contrib, hay una implementación del algoritmo Porter Stemming. Nunca se integró a 'rdbms', por lo que básicamente se queda ahí. Lo hemos usado internamente, y funcionó bastante bien, al menos para los conjuntos de datos que no eran grandes (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 Disco Map-Reduce framework.

Ya sea que pueda o no hacer el motor más rápido, no podría decirlo. ¿Hay un mercado para un motor de búsqueda más rápido? Nunca he tenido problemas con la velocidad de, p. Google. Pero me interesaría un servicio de búsqueda que aumentara mis posibilidades de encontrar buenas respuestas a mis preguntas.

+0

hey ... muchas gracias ... fue realmente muy bueno saber acerca de esto ...... – iankits

+0

así "velocidad" con los motores de búsqueda no significa realmente lo mismo que todo lo demás, ya que cuando consultas estás leyendo de un índice y todo el edificio ocurre periódicamente ...pero ya sabes Ulf;) – deepblue

2

Recomendaría CouchDB en lugar de Mnesia.

  • Mnesia no tiene Map-Reduce, CouchDB hace (corrección - ver comentarios)
  • Mnesia se escribe de forma estática, CouchDB es una base de datos de documentos (y las páginas son documentos, es decir, un mejor ajuste al modelo de información en mi opinión)
  • Mnesia is primarily intended to be a memory-resident database

pian es bastante bueno. También deberías considerar MochiWeb.

Usted no va a ir mal con Erlang

+0

Por cierto, Bjnortier! Mnesia tiene Map-reduce. Tiene un fuction "listas: map()" y "lists: foldl" que hace exactamente lo que Map y reduce respectivamente. Para obtener más información, puede consultar http://www.gotapi.com/erlang. – iankits

+0

concedido. Pero CouchDB tiene Map-Reduce incremental, es decir, solo recalcula el mapa y reduce los resultados cuando los documentos realmente han cambiado. – bjnortier

+2

La afirmación de que 'Mnesia está destinada a ser DB residente en memoria' significa que Mnesia se comporta de manera tan celestial cuando está en RAM. Sin embargo, hemos utilizado Mnesia como 'Base de datos de solo disco' y nuestras aplicaciones son muy buenas. ¿Has oído hablar de algo llamado 'Fragmentación'? bueno, mnesia es excelente con eso y cuando las tablas están fragmentadas, todas las limitaciones desaparecen. Pruébelo usted mismo, una BD de mnesia con varias tablas puede ser poblada de bytes de datos Tera cuando las tablas están fragmentadas, pero con una pérdida de velocidad muy despreciable cuando realiza una búsqueda. La concurrencia lo es todo, Mnesia es divina en la concurrencia –

Cuestiones relacionadas