Erlang、Mnesia、Yaws を使用した Web 検索エンジンの開発を考えています。これらのソフトウェアを使用して、強力で最速の Web 検索エンジンを作成することは可能ですか? これを達成するには何が必要で、何から始めればよいですか?
4 に答える
Erlang は、今日最も強力な Web クローラーを作成できます。簡単なクローラーについて説明します。
ステップ 1. シンプルな並列処理モジュールを作成します。これをmapreduceと呼びます。
-module(mapreduce)。
-エクスポート ([compute/2])。
%%=============================================== =====================
%% 使用例
%% モジュール = 文字列
%% 関数 = トークン
%% List_of_arg_lists = [["file\r\nfile","\r\n"],["muzaaya_joshua","_"]]
%% Ans = [["file","file"],["muzaaya","joshua"]]
%% ジョブは 2 つのプロセスによって実行されています
%% いいえ。生成されたプロセスの数 = length(List_of_arg_lists)
compute({モジュール,関数},List_of_arg_lists)->
S = 自己()、
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)
終わり、
リスト:foreach(Spawn_job,List_of_arg_lists),
収集 (長さ (List_of_arg_lists),Ref,[])。
収集 (0, _, L) -> L;
収集 (N、参照、L) ->
受け取る
{Ref,{'EXIT',_}} -> 収集 (N-1,Ref,L);
{参照、結果} -> 収集(N-1、参照、[結果|L])
終わり。
execute(Parent,Ref,Fun,Arg)->
親 !{Ref,(Fun(Arg) をキャッチ)}。
ステップ 2. HTTP クライアント
1 は通常、inets httpc moduleerlang に組み込まれたものかibrowse. ただし、メモリ管理と速度 (メモリ フット プリントを可能な限り低くする) のために、優れたアーラン プログラマーは を使用することを選択しますcurl。そのcurlコマンドラインを取得する which を適用することによりos:cmd/1、出力をerlang呼び出し関数に直接取得できます。それでもなお、curl がその出力をファイルにスローし、アプリケーションがこれらのファイルを読み取って解析する別のスレッド (プロセス) を持つようにする方が良いでしょう。
コマンド: curl "http://www.erlang.org" -o "/downloaded_sites/erlang/file1.html"したがって、多くのプロセスを生成できます。そのコマンドを実行するときは、URL と出力ファイル パスを忘れずにエスケープしてください。一方、ダウンロードされたページのディレクトリを監視するプロセスがあります。これらのページを読み取って解析し、解析後に削除するか、別の場所に保存するか、さらに良いことに、
Erlangの場合
os:cmd("curl \"http://www.erlang.org\" -o \"/downloaded_sites/erlang/file1.html\"")。
zip modulefolder_check()->
spawn(fun() -> check_and_report() end),
わかった。
-define(CHECK_INTERVAL,5)。
check_and_report()->
%% 使用を避ける
%% filelib:list_dir/1
%% ファイルが多い場合はメモリ !!!
case os:cmd("ls | wc -l") の
"0\n" -> OK;
"0" -> OK;
_ -> ?MODULE:new_files_found()
終わり、
sleep(timer:seconds(?CHECK_INTERVAL)),
%% チェックを続けます
check_and_report()。
new_files_found()->
%% パーサーにファイルを選択するように通知します
%% ファイルを解析したら、
%% 削除するか、保存してください
%% 他にどこ
gen_server:cast(?MODULE,files_detected)。
ステップ 3. html パーサー。
これを使ったほうがいいmochiweb's html parser and XPATH。これにより、お気に入りの HTML タグをすべて解析して取得し、コンテンツを抽出して準備を整えることができます。以下の例では、マークアップの
とのみKeywordsに焦点を当てています。descriptiontitle
シェルでのモジュールテスト...素晴らしい結果!!!
2> Spider_bot:parse_url("http://erlang.org").
[[[]、[]、
{「キーワード」、
"erlang、関数型、プログラミング、耐障害性、分散型、マルチプラットフォーム、ポータブル、ソフトウェア、マルチコア、smp、同時実行"},
{"説明","オープンソースの erlang 公式ウェブサイト"}],
{title,"erlang プログラミング言語、公式ウェブサイト"}]
3> Spider_bot:parse_url("http://facebook.com").
[[{"説明"、
" facebook は、友人や、仕事、勉強、生活を共にする人々と人々を結びつけるソーシャル ユーティリティです。人々は facebook を使用して、友人と最新情報を共有したり、写真を無制限にアップロードしたり、リンクを投稿したりします
と動画を見て、出会った人々についてもっと学びましょう。"},
{"ロボット","noodp,noydir"},
[]、[]、[]、[]]、
{title,"互換性のないブラウザ | facebook"}]
4> Spider_bot:parse_url("http://python.org").
[[{"説明"、
" Python のホームページ。インタープリタ型でインタラクティブなオブジェクト指向の拡張可能な\nプログラミング言語です。これは明快さと多用途性を並外れた組み合わせで提供し、無料で\n
包括的に移植されています。"},
{「キーワード」、
"Python プログラミング言語オブジェクト指向 Web フリー ソース"},
[]]、
{title,"python プログラミング言語 – 公式ウェブサイト"}]
5> Spider_bot:parse_url("http://www.house.gov/").
[[[]、[]、[]、
{"説明"、
"アメリカ合衆国下院のホームページ"},
{"説明"、
"アメリカ合衆国下院のホームページ"},
[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[] ,[],[],[],
[],[],[]|...],
{title,"アメリカ合衆国下院、第 111 回議会、第 2 回議会"}]
キーワードに基づいてページをインデックス化できることに加えて、ページ再訪問の適切なスケジュールを設定できることがわかります。もう 1 つの課題は、クローラー (ドメインからドメインへと Web 全体を移動するもの) を作成する方法でしたが、それは簡単です。href タグの Html ファイルを解析することで可能です。HTML パーサーですべての href タグを抽出するようにすると、特定のドメインのすぐ下にあるリンクを取得するために、あちこちで正規表現が必要になる場合があります。
クローラーの実行
7> Spider_connect:conn2("http://erlang.org").
リンク: ["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"]
わかった
ストレージ:検索エンジンにとって最も重要な概念の 1 つです。検索エンジンのデータを MySQL、Oracle、MS SQL などの RDBMS に格納するのは大きな間違いです。このようなシステムは完全に複雑であり、それらとやり取りするアプリケーションはヒューリスティック アルゴリズムを採用しています。これでKey-Value Storesにたどり着きますが、そのうちの 2 つがCouch Base ServerとRiakです。これらは優れたクラウド ファイル システムです。もう 1 つの重要なパラメータはキャッシュです。キャッシングは say を使用して実現Memcachedされ、上記の他の 2 つのストレージ システムでサポートされています。検索エンジン用のストレージ システムはschemaless DBMS、に焦点を当ててAvailability rather than Consistency。検索エンジンについて詳しくは、http: //en.wikipedia.org/wiki/Web_search_engineをご覧ください。Mnesia の代わりに CouchDB をお勧めします。
- Mnesia には Map-Reduce がありませんが、CouchDB にはあります (訂正 - コメントを参照)
- Mnesia は静的に型付けされ、CouchDB はドキュメント データベースです (そしてページはドキュメントです。つまり、私の意見では情報モデルにより適しています)。
- Mnesia は、主にメモリ常駐データベースを意図しています。
YAWSはかなり良いです。MochiWeb も考慮する必要があります。
Erlang を使えば間違いはありません
「rdbms」contribには、Porter Stemming Algorithm の実装があります。「rdbms」に統合されることはなかったので、基本的にそこに座っているだけです。内部で使用しましたが、少なくとも巨大ではないデータセットに対しては非常にうまく機能しました(膨大な量のデータでテストしていません)。
関連するモジュールは次のとおりです。
rdbms_wsearch.erl
rdbms_wsearch_idx.erl
rdbms_wsearch_porter.erl
もちろん、Disco Map-Reduce フレームワークもあります。
最速のエンジンを作れるかどうかはわかりません。より高速な検索エンジンの市場はありますか? Google などの速度で問題が発生したことはありません。しかし、私の質問に対する適切な回答を見つける可能性を高める検索機能があれば、私は興味を持ちます。