É possível desenvolver um poderoso mecanismo de pesquisa na web usando o Erlang, Mnesia & Derrapagens?

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

Pergunta

Estou pensando em desenvolver um mecanismo de pesquisa na web usando o Erlang, Mnesia & Derrapagens.É possível fazer um poderoso e o mais rápido mecanismo de pesquisa na web utilizando estes softwares?O que será preciso para fazer isso e como que eu faço para começar?

Foi útil?

Solução

Erlang pode tornar o mais poderoso de rastreador da web de hoje.Deixe-me levá-lo através de minha simples rastreador.

Passo 1.Eu crio um simples paralelismo módulo, que eu chamo de 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))}.

Passo 2. O Cliente HTTP

Se normalmente um inets httpc module construído em erlang ou ibrowse.No entanto, para o gerenciamento de memória e velocidade (chegando a impressão de pé de memória mais baixo possível), uma boa erlang programador iria escolher para usar enrolar.Aplicando-se o os:cmd/1 o que leva a que a curvatura de linha de comando, seria de se obter o resultado direto para o erlang função de chamada.Ainda assim, o seu melhor, fazer a curvatura lançar seu saídas em arquivos e, em seguida, nossa aplicação tem outro thread (processo), que lê e analisa esses arquivos

Comando: curl "http://www.erlang.org" -o "/downloaded_sites/erlang/file1.html"
Em Erlang
os:cmd("curl \"http://www.erlang.org\" -o \"/downloaded_sites/erlang/file1.html\"").
Assim, você pode gerar muitos processos.Você se lembra de escapar a URL assim como o caminho do arquivo de saída como você executar esse comando.Há um processo na outra mão, cujo trabalho é assistir o diretório de download de páginas.Nestas páginas, ele lê e analisa-los, ele pode, em seguida, eliminar após análise ou salvar em um local diferente ou, melhor ainda, arquivá-los usando o 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).

Passo 3. O analisador de html.
Melhor usar este mochiweb do analisador de html e XPATH.Isso vai ajudar você a analisar e obter o seu favorito de todos os tags de HTML, extrair o conteúdo e, em seguida, bom para ir.Os exemplos abaixo, concentrei-me apenas o Keywords, description e title na marcação


O módulo de Teste em shell...resultados impressionantes!!!

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


Agora você pode perceber que, podemos indexar as páginas contra suas palavras-chave, além de um bom esquema de página revisists.Outro desafio foi como fazer um rastreador (algo que vai movimentar toda a web, a partir de um domínio para outro), mas que é uma tarefa fácil.Sua possível pela análise de um arquivo Html para a href tags.Fazer o Analisador de HTML para extrair todas as tags href e, em seguida, você pode precisar de algumas expressões regulares, aqui e ali, para obter os links para a direita em um determinado domínio.

Executando o 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
Armazenamento: É um dos conceitos mais importantes para um motor de busca.Um grande erro para armazenar o motor de busca de dados em um SGBD, como MySQL, Oracle, MS SQL e.t.c.Tais sistemas são completamente complexo e as aplicações que interagem com eles empregam algoritmos heurísticos.Isso nos leva a Valor-Chave Lojas, de que dois dos meus melhores são Sofá Da Base De Dados De Servidor e Riak.Estas são de grande Nuvem de Sistemas de arquivos.Outro parâmetro importante é a colocação em cache.O cache é obtida usando dizer O Memcached, do que os outros dois sistemas de armazenamento acima mencionados tenham suporte para ele.Sistemas de armazenamento para os mecanismos de Pesquisa deve ser schemaless DBMS,que incide sobre Availability rather than Consistency.Leia mais em Mecanismos de Busca a partir daqui: http://en.wikipedia.org/wiki/Web_search_engine

Outras dicas

Tanto quanto eu sei Powerset 's linguagem natural motor de pesquisa procesing é desenvolvido usando erlang.

Será que você olha para couchdb (que é escrito em Erlang também) como uma ferramenta possível para ajudá-lo a resolver alguns problemas no seu caminho?

Eu recomendaria CouchDB em vez de Mnesia.

bouba é muito bom. Você também deve considerar MochiWeb.

Você não vai dar errado com Erlang

Na 'RDBMS' contrib , há uma implementação do Porter Stemming Algorithm. Nunca foi integrado 'RDBMS', por isso é basicamente apenas sentado lá fora. Temos utilizado internamente, e funcionou muito bem, pelo menos para os conjuntos de dados que não eram enorme (eu não testei-o em enormes volumes de dados).

Os módulos relevantes são:

rdbms_wsearch.erl
rdbms_wsearch_idx.erl
rdbms_wsearch_porter.erl

Depois, há, é claro, o Disco Map-Reduce quadro .

Se você pode ou não fazer o motor mais rápido lá fora, eu não poderia dizer. Existe um mercado para um motor de mais rápido procurar? Eu nunca tive problemas com a velocidade de exemplo Google. Mas um mecanismo de busca que o aumento minhas chances de encontrar boas respostas para as minhas perguntas que me interessaria.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top