Erlang、Mnesia&を使用して強力なWeb検索エンジンを開発することは可能ですか?ヨーズ?

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

質問

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

役に立ちましたか?

解決

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モジュールまたは ibrowse を使用します。 。ただし、メモリ管理と速度(メモリフットプリントを可能な限り低くする)のために、優れたアーランプログラマは カール os:cmd / 1 はcurlコマンドラインを使用し、erlang呼び出し関数に出力を直接取得します。それでもなお、curlが出力をファイルにスローし、アプリケーションがこれらのファイルを読み取り、解析する別のスレッド(プロセス)を持っている方が良いので、多くのプロセスを生成できます。そのコマンドを実行するときに、URLと出力ファイルパスをエスケープすることを忘れないでください。一方、ダウンロードされたページのディレクトリを監視する作業を行うプロセスがあります。これらのページは読み取り、解析し、解析後に削除するか、別の場所に保存するか、 zipモジュール

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\"").
を使用してアーカイブします。

ステップ3. htmlパーサー。
この mochiwebのhtmlを使用してください。パーサーとXPATH 。これにより、お気に入りのすべてのHTMLタグを解析して取得し、コンテンツを抽出して、すぐに使用できます。以下の例では、マークアップの Keywords description 、および title のみに焦点を当てています。


シェルでのモジュールテスト...素晴らしい結果!!!

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

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


これで、キーワードに対してページをインデックス付けできることに加えて、ページの改訂者の適切なスケジュールを作成できることに気付くことができます。別の課題は、クローラー(ドメイン間でWeb全体を移動するもの)を作成する方法でしたが、それは簡単です。 hrefタグのHtmlファイルを解析することで可能です。 HTMLパーサーを作成してすべてのhrefタグを抽出すると、特定のドメインの直下にリンクを取得するために、あちこちで正規表現が必要になる場合があります。

クローラーの実行

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つです。 MySQL、Oracle、MS SQL e.t.cなどのRDBMSに検索エンジンデータを保存することは大きな間違いです。そのようなシステムは完全に複雑であり、それらとインターフェースするアプリケーションは発見的アルゴリズムを使用します。これにより、 Key-Valueストア が表示されます。私のベストは Couch Base Server および リアック 。これらは優れたクラウドファイルシステムです。もう1つの重要なパラメーターはキャッシュです。キャッシングは、たとえば Memcached を使用して達成されます。上記のストレージシステムはそれをサポートしています。検索エンジン用のストレージシステムは、スキーマレスDBMS である必要があります。これは、一貫性よりも可用性に焦点を当てています。検索エンジンの詳細については、 http://en.wikipedia.org/wiki/Web_search_engine をご覧ください。

他のヒント

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

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

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。しかし、質問に対する適切な回答を見つける可能性を高める検索機能は興味をそそります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top