मैं एर्लांग, मेनेसिया & यॉ का उपयोग कर एक वेब सर्च इंजन विकसित करने के बारे में सोच रहा हूं। क्या इन सॉफ़्टवेयर का उपयोग करके एक शक्तिशाली और तेज़ वेब सर्च इंजन बनाना संभव है? इसे पूरा करने के लिए क्या करना होगा और मैं किस प्रकार से शुरू करूं?क्या एरलांग, मेनेसिया और यॉज़ का उपयोग करके एक शक्तिशाली वेब सर्च इंजन विकसित करना संभव है?
उत्तर
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
erlang या ibrowse
में बनाया का प्रयोग करेंगे बनाने । हालांकि, स्मृति प्रबंधन और गति के लिए (मेमोरी पैर प्रिंट जितना संभव हो उतना कम हो रहा है), एक अच्छा एरलांग प्रोग्रामर curl
का उपयोग करना चुनता है। os:cmd/1
को लागू करने से जो कर्ल कमांड लाइन लेता है, कोई आउटपुट सीधे एर्लंग कॉलिंग फ़ंक्शन में प्राप्त करेगा। फिर भी, यह बेहतर है कि कर्ल को अपने आउटपुट को फाइलों में फेंक दें और फिर हमारे एप्लिकेशन में एक और थ्रेड (प्रक्रिया) है जो इन फ़ाइलों को पढ़ता है और पार्स करता है
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\"").
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 पार्सर का उपयोग कर संग्रह के।
बेहतर mochiweb's html parser and XPATH
का उपयोग करें। यह आपको पार्स और अपने सभी पसंदीदा एचटीएमएल टैग प्राप्त करने, सामग्री निकालने और फिर जाने के लिए अच्छा करने में मदद करेगा। उदाहरण नीचे, मैं मार्कअप
मॉड्यूल खोल में परीक्षण ... भयानक परिणामों में केवल 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"}]
अब आपको पता कर सकते हैं कि, हम कर सकते हैं सूचकांक उनके कीवर्ड के खिलाफ पृष्ठों, प्लस पेज revisists का एक अच्छा अनुसूची। एक और चुनौती यह थी कि क्रॉलर कैसे बनाना है (कुछ ऐसा जो पूरे वेब के चारों ओर डोमेन से डोमेन तक चलेगा), लेकिन वह आसान है। Href टैग के लिए एक HTML फ़ाइल को पार्स करके इसे संभव है। सभी href टैग निकालने के लिए HTML पार्सर बनाएं और फिर किसी दिए गए डोमेन के नीचे लिंक प्राप्त करने के लिए आपको यहां और वहां कुछ नियमित अभिव्यक्तियों की आवश्यकता हो सकती है।
क्रॉलर रनिंग
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संग्रहण: एक खोज इंजन के लिए सबसे महत्वपूर्ण अवधारणाओं में से एक है। आरडीबीएमएस जैसे माईएसक्यूएल, ओरेकल, एमएस एसक्यूएल e.t.c. में सर्च इंजन डेटा स्टोर करने की एक बड़ी गलती है। इस तरह के सिस्टम पूरी तरह से जटिल हैं और उनके साथ इंटरफेस करने वाले अनुप्रयोगों में हेरिस्टिक एल्गोरिदम कार्यरत हैं। यह Key-Value Stores, जिनमें से मेरा सबसे अच्छा में से दो हैं
Couch Base Server
और
Riak
करने के लिए हमें लाता है। ये महान क्लाउड फाइल सिस्टम हैं। एक और महत्वपूर्ण पैरामीटर कैशिंग है। कैशिंग को
Memcached
का उपयोग करके प्राप्त किया जाता है, जिसमें ऊपर वर्णित अन्य दो स्टोरेज सिस्टमों का समर्थन होता है। खोज इंजन के लिए स्टोरेज सिस्टम
schemaless DBMS
होना चाहिए, जो
Availability rather than Consistency
पर केंद्रित है। यहां से खोज इंजन पर और पढ़ें:
http://en.wikipedia.org/wiki/Web_search_engine
+1 साझा करने के लिए धन्यवाद! – Jonas
उपरोक्त कोड में, मैंने 'पुनः' मॉड्यूल, नियमित अभिव्यक्तियों का उपयोग किया है, लेकिन अब 'मोचीवेब' में निर्मित एरलांग में 'XPATH' कार्यान्वयन का उपयोग करके HTML को पार्स करने का एक बेहतर तरीका है। इसका पालन करें: http://ppolv.wordpress.com/2008/05/09/fun-with-mochiwebs-html-parser-and-xpath/ –
@MuzaayaJoshua इस उत्तर के लिए बहुत बहुत धन्यवाद! मैंने कुछ साल पहले PHP में एक वेब मकड़ी लिखा था। हालांकि, यह मूल रूप से इरादे से कहीं अधिक हो गया है, और अब सर्वर संसाधनों को सही ढंग से चलाने की जरूरत है, वे केवल अवास्तविक हैं। घर में हम इसे एरलांग या सी में पुन: संगठित करने पर विचार कर रहे हैं, लेकिन इसके प्रदर्शन और स्केलेबिलिटी लाभों के कारण एर्लांग में बहुत दिलचस्पी है। क्या आपके पास कोई तुलना है कि यह अन्य भाषाओं में एक ही मकड़ी के लिए कितनी अच्छी तरह से काम करता है? क्या आपने इसे अन्य भाषाओं में आजमाया? अगर ऐसा हुआ तो इसकी तुलना कैसे हुई? – user658182
जहाँ तक मुझे पता है कि Powerset की प्राकृतिक भाषा प्रोसेसर सर्च इंजन एरलांग का उपयोग करके विकसित की गई है।
क्या आपने couchdb (जो एर्लांग में भी लिखा है) को एक संभावित टूल के रूप में देखा है ताकि आप अपने रास्ते पर कुछ समस्याएं हल कर सकें?
धन्यवाद बहुत मंद। यह वास्तव में जानकारीपूर्ण और सहायक है। ;) – iankits
'rdbms' contrib में, पोर्टर स्टेमिंग एल्गोरिदम का कार्यान्वयन है। इसे कभी भी 'rdbms' में एकीकृत नहीं किया गया था, इसलिए यह मूल रूप से वहां बस बैठा है। हमने इसे आंतरिक रूप से उपयोग किया है, और कम से कम उन डेटासेट्स के लिए यह बहुत अच्छा काम करता है जो विशाल नहीं थे (मैंने इसे विशाल डेटा वॉल्यूम पर परीक्षण नहीं किया है)।
प्रासंगिक मॉड्यूल हैं:
rdbms_wsearch.erl
rdbms_wsearch_idx.erl
rdbms_wsearch_porter.erl
तो फिर वहाँ है, ज़ाहिर है, Disco Map-Reduce framework।
चाहे आप सबसे तेज़ इंजन बना सकते हैं या नहीं, मैं नहीं कह सकता था। क्या तेज खोज इंजन के लिए कोई बाजार है? मुझे कभी भी गति की समस्या नहीं है गूगल। लेकिन एक खोज सुविधा जिसने मेरे सवालों के अच्छे जवाब खोजने की संभावनाओं में वृद्धि की, मुझे रूचि होगी।
मैं मैनेशिया के बजाय कॉच डीबी की सिफारिश करता हूं।
- Mnesia मानचित्र-कम नहीं है, CouchDB करता है (सुधार - टिप्पणी देखें)
- Mnesia स्थिर लिखा गया, CouchDB एक दस्तावेज़ डेटाबेस है (और पृष्ठों दस्तावेजों, यानी एक बेहतर जानकारी मॉडल के लिए फिट हैं मेरी राय में)
- Mnesia is primarily intended to be a memory-resident database
याज काफ़ी अच्छी है। आपको मोचीवेब पर भी विचार करना चाहिए।
आप Erlang
के साथ गलत नहीं जाना होगावैसे, Bjnortier! मेनेसिया में मानचित्र-कमी है। इसमें एक फक्शन "सूचियां हैं: मानचित्र()" और "सूचियां: फ़ोल्डल" जो वास्तव में मानचित्र और कम से कम कम करती है। अधिक जानकारी के लिए, आप http://www.gotapi.com/erlang का उल्लेख कर सकते हैं। – iankits
अनुमोदित। लेकिन कॉच डीबी में वृद्धिशील मानचित्र-कमी है, यानी यह केवल मानचित्र को फिर से समझता है और दस्तावेज़ों को वास्तव में बदलते समय आउटपुट को कम करता है। – bjnortier
यह बयान कि 'मेनेसिया मेमोरी निवासी डीबी' होने का इरादा है, इसका मतलब है कि जब मैमिया रैम में इतनी स्वर्गीय प्रदर्शन करता है। हालांकि, हमने मेनेसिया को 'डिस्क केवल डाटाबेस' के रूप में उपयोग किया है और हमारे आवेदन बहुत अच्छे हैं। क्या आपने 'फ्रैगमेंटेशन' नामक चीज़ के बारे में सुना है? ठीक है, मैनेशिया उस के साथ उत्कृष्ट है और जब टेबल खंडित होते हैं, तो सभी सीमाएं समाप्त हो जाती हैं। इसे अपने आप आज़माएं, कई टेबलों के साथ एक मैनेशिया डीबी डेटा के टेरा बाइट्स पर पॉप्युलेट किया जा सकता है जब टेबल को खंडित किया जाता है, फिर भी जब आप एक नज़र डालते हैं तो गति में बहुत नगण्य हानि होती है। Concurrency सब कुछ है, Mnesia concurrency पर दिव्य है –
क्या आप इस सवाल से पूछ रहे हैं कि किसी ने पहले ही यह कर लिया है और आपको यह बताने का अनुभव है? :) –
रॉबर्ट पी! ऐसा कुछ भी नहीं;)। दरअसल, मैं इन लंगों का उपयोग कर रहा हूं। मेरी कंपनी में एक उत्पाद के विकास के लिए। मूल रूप से, यह फ्रेम काम (एरलांग, मैनेसिया और यॉज) यहां भारत में नहीं जाना जाता है। लेकिन मैं इन लंगों का उपयोग कर उपरोक्त खोज इंजन विकसित करने के बारे में सोच रहा था लेकिन यह नहीं जानता कि यह कैसे प्रतिक्रिया करेगा? – iankits