Python से बना 80-लाइन का सर्च इंजन
- पिछले सितंबर में Wallapop में search data scientist के रूप में शामिल होने के बाद, लेखक Solr नामक open source search engine के साथ काम कर रहे हैं.
- सर्च इंजन के बुनियादी सिद्धांतों को समझने के लिए उन्होंने Python का उपयोग करके शुरू से एक सर्च इंजन बनाने का फैसला किया.
- लक्ष्य "छोटी वेबसाइटों की discoverability crisis" को हल करना है, यानी उन छोटी वेबसाइटों को फिर से खोजने योग्य बनाना जिन्हें Google जैसे सर्च इंजन से ढूँढा नहीं जा सकता.
- यह लेख Python का उपयोग करके सर्च इंजन बनाने की प्रक्रिया बताता है, और लिखा गया पूरा कोड GitHub के microsearch repository में देखा जा सकता है.
- बनाया गया सर्च इंजन production-ready नहीं है, बल्कि यह एक उपयोगी toy example है जो दिखाता है कि सर्च इंजन अंदर से कैसे काम करते हैं.
microsearch
- इसमें microsearch के घटकों को देखा गया है और यह समझा गया है कि हर हिस्से को कैसे बनाया गया: (1) crawler, (2) inverted index, (3) ranking, (4) interface.
crawler
- सर्च इंजन बनाने का पहला कदम है खोजने के लिए डेटा इकट्ठा करना.
- "local Google" बनाने के इरादे से लेखक ने जिन ब्लॉगों को follow किया, उनके डेटा का उपयोग करके सर्च इंजन बनाया.
- crawling में चुनी गई ब्लॉग सूची की सभी पोस्ट डाउनलोड करना और उन्हें व्यवस्थित करना शामिल है.
- इसे तेज़ बनाने के लिए asyncio Python library का उपयोग किया गया, जिससे crawling time 20 मिनट से घटकर 20 सेकंड रह गया.
- 642 RSS feeds का उपयोग किया गया, जिनमें लगभग 100 अक्सर पढ़े जाने वाले ब्लॉग थे और बाकी 500 surprisetalk blog project से लिए गए.
inverted index
- inverted index एक data structure है जो keywords को documents से map करता है, ताकि यह आसानी से पता चल सके कि कोई खास शब्द किन documents में आता है.
- जब उपयोगकर्ता कोई query खोजता है, तो query के keywords से मेल खाने वाले सभी documents को पाने के लिए inverted index का उपयोग किया जाता है.
- inverted index का logic SearchEngine नाम की class के भीतर परिभाषित है, और इसे दो dictionaries को initialize करके लागू किया गया है.
ranking
- किसी दी गई query के लिए matching documents का set मिल जाने के बाद, उन्हें sort करने का तरीका चाहिए.
- सबसे प्रसिद्ध ranking method Google का PageRank है, लेकिन BM25 जैसे अन्य विकल्प भी हैं जो content के आधार पर documents को rank करते हैं.
- SearchEngine class के छूटे हुए हिस्सों को लागू किया गया है, जिसमें BM25 score की गणना का तरीका भी शामिल है.
interface
- सर्च इंजन बना लेने के बाद उसे किसी न किसी रूप में सार्वजनिक करना जरूरी है.
- इसके लिए एक FastAPI app बनाया गया, जो सर्च इंजन को expose करने वाले endpoints देता है और search चलाने के लिए एक साधारण webpage render करता है.
- output को आसानी से पढ़ने योग्य बनाने के लिए केवल top N URLs चुनने का फैसला किया गया.
छूटी हुई विशेषताएँ
- जो पाठक अक्सर सर्च इंजन के साथ काम करते हैं, वे आसानी से देख सकते हैं कि इस implementation में कई features गायब हैं.
- query operators, n-gram indexing, query या document expansion, और crawling व indexing को एक साथ चलाने जैसी क्षमताएँ शामिल नहीं हैं.
निष्कर्ष
- इस प्रोजेक्ट को करते हुए लेखक को Solr के अंदरूनी कामकाज की बेहतर समझ मिली और asynchronous code लिखने के फायदे सीखने को मिले.
- व्यक्तिगत सर्च इंजन बनाने के अगले कदम के रूप में लेखक इसमें semantic search feature जोड़ने की योजना बना रहे हैं.
GN⁺ की राय
- इस लेख का सबसे महत्वपूर्ण बिंदु यह है कि छोटी वेबसाइटों की discoverability सुधारने के लिए कोई व्यक्ति खुद सर्च इंजन बना सकता है.
- Python और open source libraries का उपयोग करके जटिल क्षमताओं वाले सर्च इंजन को सरल रूप में लागू करने का अनुभव शुरुआती software engineers के लिए भी प्रेरक हो सकता है.
- asynchronous programming की दक्षता और data structures के महत्व को वास्तविक उदाहरण के जरिए दिखाकर यह लेख तकनीकी insight और व्यावहारिक learning opportunity दोनों देता है.
1 टिप्पणियां
Hacker News प्रतिक्रियाएँ
Pandas का उपयोग करके BM25 search engine बनाना
कोड review:
SearchEngineclassk1औरbनाम के parameters का मतलब समझ नहीं आता, और कोड में बिल्कुल comments नहीं हैं._documentsमें संभवतः URL key के रूप में है, और उस URL की content value के रूप में.search engine की complexity
कोड की lines की संख्या पर राय
कोड के expression पर मज़ाक
chunk for chunk in chunks if chunkexpression देखकर लकड़हारे से जुड़ा एक मज़ाक याद आता है.recommendation engine code example
parsing library performance comparison
lxml.htmlऔरlxml.html.clean,BeautifulSoupकी तुलना में काफ़ी तेज़ हो सकते हैं, ऐसा उल्लेख है.keyword उपयोग पर सलाह
शैक्षिक project पर राय
Python के साथ बड़े पैमाने के data processing पर सवाल