5


8

MnesiaのErlangを使ったWeb検索エンジンの開発を考えています これらのソフトウェアを使用して強力で最速のWeb検索エンジンを作ることは可能ですか? これを達成するために何が必要でしょうか、そして私は何から始めますか?

4 Answer


19


Erlangは今日最も強力なWebクローラーを作ることができます。 私の簡単なクローラーを通してあなたを連れて行きましょう。

ステップ1。 私は私が_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))}.

ステップ2。 * HTTPクライアント*
通常、erlangに組み込まれている inets httpc module`か ibrowse`のどちらかを使います。 しかしながら、メモリ管理とスピード(メモリフットプリントをできるだけ小さくする)のために、良いアーランプログラマは `curl`を使うことを選ぶでしょう。 そのcurlコマンドラインを取る `os:cmd / 1`を適用することによって、出力を直接erlang呼び出し関数に入れるでしょう。 それでもなお、より良いのは、curlにその出力をファイルにスローさせることです。それから私たちのアプリケーションは、これらのファイルを読み込んで解析する別のスレッド(プロセス)を持ちます。

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\"").

それで、あなたは多くのプロセスを生み出すことができます。 このコマンドを実行するときには、URLと出力ファイルパスをエスケープすることを忘れないでください。 その一方で、ダウンロードしたページのディレクトリを監視することを目的としたプロセスがあります。 これらのページを読み込んで解析します。解析後に削除したり、別の場所に保存したり、さらに良いことには、 `zipモジュール`を使用してそれらをアーカイブします。

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パーサ*この mochiwebのhtmlパーサと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"}]
+

あなたは今、我々は彼らのキーワードに対してページを索引付けすることができることに加えてページ改訂の良いスケジュールを立てることができることを理解することができます。 もう1つの課題は、クローラを作成する方法(ドメインからドメインへとWeb全体を移動する方法)ですが、それは簡単です。 それはhrefタグのためのHTMLファイルを解析することによって可能です。 HTMLパーサーを作成してすべての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
  • Storage: は検索エンジンにとって最も重要な概念の1つです。 検索エンジンのデータをMySQL、Oracle、MS SQLなどのRDBMSに格納するのは大きな間違いです。 そのようなシステムは完全に複雑であり、それらとインターフェースをとるアプリケーションはヒューリスティックなアルゴリズムを採用しています。 これは私たちを http://cattell.net/datastores/Datastores.pdf [Key-Value Stores] に導きます。そのうち私の2つは Couch Base Server ` Riak` *です。 これらは素晴らしいクラウドファイルシステムです。 もう1つの重要なパラメータはキャッシュです。 キャッシングは例えば `Memcached 'を使って達成され、そのうち上記の他の2つのストレージシステムはそれをサポートしています。 検索エンジン用のストレージシステムは `スキーマレスDBMS`であるべきです。それは`一貫性よりむしろ可用性 `に焦点を合わせます。 検索エンジンの詳細については、こちらを参照してください。http://en.wikipedia.org/wiki/Web_search_engine


4


私の知る限りでは Powersetの自然言語処理検索エンジンはerlangを使って開発されています。

途中でいくつかの問題を解決するのに役立つ可能性のあるツールとして couchdb(これもerlangで書かれています)を見ましたか?


2


私はMnesiaの代わりにCouchDBをお勧めします。

  • MnesiaはMap-Reduceを持っていません、CouchDBは持っていません(訂正 - コメントを見てください)

  • Mnesiaは静的に型付けされ、CouchDBは文書データベースです(そしてページは文書です。 私の意見では、情報モデルへのより良い適合

  • Mnesiaは主にメモリ常駐型データベースを意図しています

YAWSはかなりいいです。 あなたはMochiWebも考慮する必要があります。

あなたはErlangでうまくいかない


1


http://jungerl.cvs.sourceforge.net/viewvc/jungerl/jungerl/lib/rdbms/src/['rdbms 'contrib]に、Porter Stemming Algorithmの実装があります。 それは決して 'rdbms'に統合されていなかったので、それは基本的にそこに座っているだけです。 私たちはこれを内部的に使ってきましたが、少なくともそれほど大きくないデータセットに対しては非常にうまくいきました(私はそれを巨大なデータボリュームでテストしたことはありません)。

関連モジュールは以下のとおりです。

rdbms_wsearch.erl rdbms_wsearch_idx.erl rdbms_wsearch_porter.erl

それから、もちろん、http://discoproject.org/ [Disc Map-Reduceフレームワーク]があります。

あなたがそこで最速のエンジンを作ることができるかどうか、私は言うことができませんでした。 より速い検索エンジンの市場はありますか? 私は例えばの速度に問題があったことがない。 グーグル。 しかし、私の質問に対する良い答えを見つける可能性が高まった検索機能は、私にとって興味があるでしょう。