هل من الممكن تطوير محرك بحث ويب قوي باستخدام Erlang وMnesia وYaws؟

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

سؤال

أفكر في تطوير محرك بحث ويب باستخدام Erlang وMnesia وYaws.هل من الممكن إنشاء محرك بحث ويب قوي وأسرع باستخدام هذه البرامج؟ما الذي سيحتاجه لتحقيق ذلك وكيف أبدأ به؟

هل كانت مفيدة؟

المحلول

يمكن لـ Erlang أن يصنع أقوى زاحف ويب اليوم.اسمحوا لي أن آخذك عبر الزاحف البسيط الخاص بي.

الخطوة 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

عادة ما يستخدم المرء إما inets httpc module بنيت في إرلانج أو تصفح.ومع ذلك، لإدارة الذاكرة وسرعتها (الحصول على أدنى مستوى ممكن من الذاكرة)، قد يختار مبرمج إيرلانج الجيد استخدامها لفة.من خلال تطبيق نظام التشغيل:كمد/1 الذي يأخذ سطر أوامر الضفيرة هذا، يمكن للمرء الحصول على الإخراج مباشرة في وظيفة استدعاء erlang.ومع ذلك، من الأفضل أن نجعل الضفيرة ترمي مخرجاتها إلى الملفات ومن ثم يكون لتطبيقنا مؤشر ترابط (عملية) آخر يقرأ هذه الملفات ويحللها

يأمر: 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 لاستخراج جميع علامات 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
تخزين: يعد أحد أهم المفاهيم لمحرك البحث.من الخطأ الكبير تخزين بيانات محرك البحث في نظام RDBMS مثل MySQL وOracle وMS SQL وما إلى ذلك.هذه الأنظمة معقدة تمامًا والتطبيقات التي تتفاعل معها تستخدم خوارزميات إرشادية.هذا يقودنا إلى متاجر القيمة الرئيسية, ، وهما من أفضل ما عندي خادم قاعدة الأريكة و رياك.هذه أنظمة ملفات سحابية رائعة.معلمة أخرى مهمة هي التخزين المؤقت.يتم تحقيق التخزين المؤقت باستخدام القول ميمكاشد, ، والتي يدعمها نظاما التخزين الآخران المذكوران أعلاه.يجب أن تكون أنظمة التخزين لمحركات البحث schemaless DBMS، والذي يركز على Availability rather than Consistency.اقرأ المزيد عن محركات البحث من هنا: http://en.wikipedia.org/wiki/Web_search_engine

نصائح أخرى

وبقدر ما أعرف باورسيت تم تطوير محرك بحث معالجة عملية اللغة الطبيعية الصورة باستخدام إرلانج.

هل نظرتم كاوتش دي بي (والذي هو مكتوب في إرلانج كذلك) كأداة محتملة لمساعدتك على حل بعض المشاكل في طريقك؟

أوصي بـ CouchDB بدلاً من Mnesia.

YAWS جيد جدًا.يجب عليك أيضًا التفكير في MochiWeb.

لن تخطئ مع إرلانج

'RDBMS' contrib ، هناك تنفيذ بورتر انطلاقا خوارزمية. تم دمجها أبدا إلى "RDBMS، حتى انها في الأساس مجرد الجلوس هناك. لقد استخدامه داخليا، وانها عملت بشكل جيد جدا، على الأقل بالنسبة لمجموعات البيانات التي لم تكن ضخمة (أنا لم نجرب ذلك على وحدات تخزين بيانات ضخمة).

والوحدات ذات الصلة هي:

rdbms_wsearch.erl
rdbms_wsearch_idx.erl
rdbms_wsearch_porter.erl

وبعد ذلك هناك، بطبيعة الحال، ديسكو خريطة-تقليل إطار .

وأم لا يمكنك جعل أسرع محرك هناك، وأنا لا يمكن أن أقول. هل هناك سوق ل<م> محرك بحث بشكل أسرع؟ أنا لم أصب مشاكل مع سرعة على سبيل المثال جوجل. ولكن ميزة البحث أن زيادة فرصي في العثور على أجوبة جيدة على أسئلتي سوف تعنيني.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top