Можно ли разработать мощную поисковую систему с использованием Erlang, Mnesia и Yaws?

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

Вопрос

Я подумываю о разработке поисковой системы с использованием Erlang, Mnesia и Yaws.Можно ли создать мощную и самую быструю поисковую систему с помощью этого программного обеспечения?Что для этого потребуется и как с чего начать?

Это было полезно?

Решение

На сегодняшний день Erlang может создать самый мощный веб-сканер.Позвольте мне провести вас через мой простой сканер.

Шаг 1.Я создаю простой модуль параллелизма, который называю уменьшение карты

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

Шаг 2. HTTP-клиент

Обычно можно использовать либо inets httpc module встроенный в erlang или просматривать.Однако для управления памятью и скорости (как можно меньше занимаемой памяти) хороший программист на Erlang предпочел бы использовать завиток.Применяя ОС: cmd/1 который принимает эту командную строку Curl, можно будет получить выходные данные непосредственно в вызывающую функцию erlang.Тем не менее, лучше заставить Curl выбрасывать свои выходные данные в файлы, а затем у нашего приложения будет другой поток (процесс), который читает и анализирует эти файлы.

Команда: curl "http://www.erlang.org" -o "/downloaded_sites/erlang/file1.html"
В Эрланге
os:cmd("curl \"http://www.erlang.org\" -o \"/downloaded_sites/erlang/file1.html\"").
Таким образом, вы можете создать множество процессов.Не забудьте экранировать URL-адрес, а также путь к выходному файлу при выполнении этой команды.С другой стороны, есть процесс, работа которого заключается в просмотре каталога загруженных страниц.Эти страницы он читает и анализирует, затем может удалить после анализа или сохранить в другом месте или, что еще лучше, заархивировать их с помощью 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).

Шаг 3. HTML-парсер.
Лучше используйте это HTML-парсер mochiweb и XPATH.Это поможет вам проанализировать и получить все ваши любимые HTML-теги, извлечь содержимое и приступить к работе.В приведенных ниже примерах я сосредоточился только на Keywords, description и title в разметке


Тестирование модуля в оболочке... потрясающие результаты!!!

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


Теперь вы можете это понять: мы можем индексировать страницы по их ключевым словам, а также составить хороший график повторных посещений страниц.Еще одна проблема заключалась в том, как создать сканер (что-то, что будет перемещаться по всей сети, от домена к домену), но это легко.Это возможно путем анализа Html-файла на наличие тегов href.Сделайте HTML Parser для извлечения всех тегов href, и тогда вам могут понадобиться некоторые регулярные выражения здесь и там, чтобы получить ссылки прямо в данном домене.

Запуск сканера

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
Хранилище: Это одно из важнейших понятий для поисковой системы.Хранить данные поисковых систем в СУБД, таких как MySQL, Oracle, MS SQL и т. д., — большая ошибка.Такие системы очень сложны, и взаимодействующие с ними приложения используют эвристические алгоритмы.Это подводит нас к Хранилища ключей и значений, из которых два моих лучших Диванный базовый сервер и Риак.Это отличные облачные файловые системы.Еще один важный параметр — кэширование.Кэширование достигается с помощью, скажем, Мемкеш, из которых две другие упомянутые выше системы хранения поддерживают его.Системы хранения данных для поисковых систем должны быть schemaless DBMS, который фокусируется на Availability rather than Consistency.Подробнее о поисковых системах можно прочитать здесь: http://en.wikipedia.org/wiki/Web_search_engine

Другие советы

Насколько я знаю, Powerset поисковая система для обработки естественного языка разработана с использованием erlang.

Вы рассматривали couchdb (который также написан на erlang) как возможный инструмент чтобы помочь вам решить несколько проблем на вашем пути?

Я бы порекомендовал CouchDB вместо Mnesia.

YAWS довольно хорош.Вам также следует рассмотреть MochiWeb.

Вы не ошибетесь с Эрлангом

В «rdbms» contrib есть реализация алгоритма Портера Стемминга. Он никогда не был интегрирован в «rdbms», поэтому он просто сидит там. Мы использовали его внутренне, и он работал довольно хорошо, по крайней мере, для наборов данных, которые не были огромными (я не проверял это на больших объемах данных).

Соответствующие модули:

rdbms_wsearch.erl
rdbms_wsearch_idx.erl
rdbms_wsearch_porter.erl

Кроме того, есть структура Disco Map-Reduce .

Могу ли я сказать, сможешь ли ты создать самый быстрый двигатель? Есть ли рынок для более быстрой поисковой системы? У меня никогда не было проблем со скоростью, например Google. Но поиск, который увеличил бы мои шансы найти хорошие ответы на мои вопросы, заинтересовал бы меня.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top