هل من الممكن تطوير محرك بحث ويب قوي باستخدام Erlang وMnesia وYaws؟
-
10-07-2019 - |
سؤال
أفكر في تطوير محرك بحث ويب باستخدام 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"حتى تتمكن من إنتاج العديد من العمليات.تتذكر الهروب من عنوان 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 لاستخراج جميع علامات 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.
- Mnesia لا يحتوي على Map-Reduce، وCouchDB لديه (تصحيح - راجع التعليقات)
- يتم كتابة Mnesia بشكل ثابت، وCouchDB هي قاعدة بيانات للمستندات (والصفحات عبارة عن مستندات، أي مستندات).أكثر ملاءمة لنموذج المعلومات في رأيي)
- المقصود من Mnesia في المقام الأول أن تكون قاعدة بيانات مقيمة في الذاكرة
YAWS جيد جدًا.يجب عليك أيضًا التفكير في MochiWeb.
لن تخطئ مع إرلانج
'RDBMS' contrib ، هناك تنفيذ بورتر انطلاقا خوارزمية. تم دمجها أبدا إلى "RDBMS، حتى انها في الأساس مجرد الجلوس هناك. لقد استخدامه داخليا، وانها عملت بشكل جيد جدا، على الأقل بالنسبة لمجموعات البيانات التي لم تكن ضخمة (أنا لم نجرب ذلك على وحدات تخزين بيانات ضخمة).
والوحدات ذات الصلة هي:
rdbms_wsearch.erl
rdbms_wsearch_idx.erl
rdbms_wsearch_porter.erl
وبعد ذلك هناك، بطبيعة الحال، ديسكو خريطة-تقليل إطار .
وأم لا يمكنك جعل أسرع محرك هناك، وأنا لا يمكن أن أقول. هل هناك سوق ل<م> م> محرك بحث بشكل أسرع؟ أنا لم أصب مشاكل مع سرعة على سبيل المثال جوجل. ولكن ميزة البحث أن زيادة فرصي في العثور على أجوبة جيدة على أسئلتي سوف تعنيني.