Можно ли разработать мощную поисковую систему с использованием Erlang, Mnesia и Yaws?
-
10-07-2019 - |
Вопрос
Я подумываю о разработке поисковой системы с использованием 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"Таким образом, вы можете создать множество процессов.Не забудьте экранировать URL-адрес, а также путь к выходному файлу при выполнении этой команды.С другой стороны, есть процесс, работа которого заключается в просмотре каталога загруженных страниц.Эти страницы он читает и анализирует, затем может удалить после анализа или сохранить в другом месте или, что еще лучше, заархивировать их с помощью
В Эрланге
os:cmd("curl \"http://www.erlang.org\" -o \"/downloaded_sites/erlang/file1.html\"").
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Другие советы
Я бы порекомендовал CouchDB вместо Mnesia.
- В Mnesia нет Map-Reduce, в CouchDB есть (исправление - см. комментарии)
- Mnesia статически типизирована, CouchDB — это база данных документов (а страницы — это документы, т.е.на мой взгляд, лучше подходит для информационной модели)
- Mnesia в первую очередь задумана как резидентная база данных.
YAWS довольно хорош.Вам также следует рассмотреть MochiWeb.
Вы не ошибетесь с Эрлангом
В «rdbms» contrib есть реализация алгоритма Портера Стемминга. Он никогда не был интегрирован в «rdbms», поэтому он просто сидит там. Мы использовали его внутренне, и он работал довольно хорошо, по крайней мере, для наборов данных, которые не были огромными (я не проверял это на больших объемах данных).
Соответствующие модули:
rdbms_wsearch.erl
rdbms_wsearch_idx.erl
rdbms_wsearch_porter.erl
Кроме того, есть структура Disco Map-Reduce .
Могу ли я сказать, сможешь ли ты создать самый быстрый двигатель? Есть ли рынок для более быстрой поисковой системы? У меня никогда не было проблем со скоростью, например Google. Но поиск, который увеличил бы мои шансы найти хорошие ответы на мои вопросы, заинтересовал бы меня.