पूर्ण पाठ खोज इंजन की तुलना - Lucene, Sphinx, Postgresql, MySQL?


312

मैं एक Django साइट बना रहा हूं और मैं एक खोज इंजन की तलाश कर रहा हूं।

कुछ उम्मीदवार:

  • कम्पास / सोलर के साथ ल्यूसीन / ल्यूसीन

  • गूढ़ व्यक्ति

  • Postgresql अंतर्निहित पूर्ण पाठ खोज

  • MySQl अंतर्निहित पूर्ण पाठ खोज

चयन करने का मापदंड:

  • परिणाम प्रासंगिकता और रैंकिंग
  • खोज और अनुक्रमण गति
  • Django के साथ उपयोग में आसानी और एकीकरण में आसानी
  • संसाधन आवश्यकताएँ - साइट को VPS पर होस्ट किया जाएगा , इसलिए आदर्श रूप से खोज इंजन को बहुत अधिक RAM और CPU की आवश्यकता नहीं होगी
  • scalability
  • अतिरिक्त विशेषताएं जैसे "क्या आपका मतलब था?", संबंधित खोजें, आदि

जिस किसी को भी उपरोक्त खोज इंजन के साथ अनुभव हुआ है, या अन्य इंजन सूची में नहीं हैं - मुझे आपकी राय सुनना अच्छा लगेगा।

EDIT: जैसे ही इंडेक्सिंग जरूरतों के लिए, उपयोगकर्ता साइट में डेटा दर्ज करते रहते हैं, उन डेटा को लगातार अनुक्रमित करना होगा। यह वास्तविक समय नहीं है, लेकिन आदर्श रूप से नया डेटा 15 से 30 मिनट की देरी के साथ सूचकांक में दिखाई देगा


26
2 are: MySQL फुलटेक्स्ट खोज और लेनदेन (वर्तमान में) परस्पर अनन्य हैं। MySQL फुलटेक्स्ट इंडेक्स को MyISAM टेबल प्रकार की आवश्यकता होती है, जो लेनदेन का समर्थन नहीं करता है। (जैसा कि InnoDB तालिका प्रकार जो लेन-देन का समर्थन करता है करने का विरोध किया, लेकिन नहीं की प्रतिलिपि प्राप्त अनुक्रमित।)
कार्ल जी

2
PostgreSQL पूर्ण-पाठ खोज, वाक्यांश खोज का समर्थन Tsearch नहीं करता है । हालाँकि, यह TODO सूची sai.msu.su/~megera/wiki/FTS_Todo पर है
ज्ञानम

1
Django के लिए इसे देखने वाला कोई भी व्यक्ति हाईस्टैक ऐप की जांच करना चाहिए। haystacksearch.org
कीओ


24
@CarlG, हर किसी के संदर्भ के लिए। MySQL 5.6+ में innodb इंजन के साथ फुल टेक्स्ट सर्च सपोर्ट
DhruvPathak

जवाबों:


167

ल्यूसिने के बारे में किसी की ठिठोली देखना अच्छा है - क्योंकि मुझे इस बारे में कोई पता नहीं है।

दूसरी ओर, स्फिंक्स, मैं अच्छी तरह से जानता हूं, तो आइए देखें कि क्या मैं कुछ मदद कर सकता हूं।

  • परिणाम प्रासंगिकता रैंकिंग डिफ़ॉल्ट है। आप अपनी खुद की छँटाई सेट कर सकते हैं, जो आपको चाहिए, और विशिष्ट क्षेत्रों को उच्च भार देना चाहिए।
  • इंडेक्सिंग गति सुपर-फास्ट है, क्योंकि यह सीधे डेटाबेस से बात करती है। कोई सुस्ती जटिल SQL प्रश्नों और गैर-अनुक्रमित विदेशी कुंजियों और ऐसी अन्य समस्याओं से आएगी। मैंने कभी भी खोज में कोई सुस्ती नहीं देखी।
  • मैं एक रेल आदमी हूँ, इसलिए मुझे नहीं पता कि Django के साथ इसे लागू करना कितना आसान है। एक पायथन एपीआई है जो स्फिंक्स स्रोत के साथ आता है।
  • खोज सेवा डेमॉन (सर्चड) मेमोरी उपयोग पर बहुत कम है - और आप इस पर सीमा निर्धारित कर सकते हैं कि अनुक्रमणिका प्रक्रिया कितनी मेमोरी का उपयोग करती है।
  • स्केलेबिलिटी वह जगह है जहां मेरा ज्ञान अधिक स्केच है - लेकिन यह कई मशीनों में इंडेक्स फाइलों को कॉपी करने और कई सर्च डेमों को चलाने के लिए काफी आसान है। सामान्य धारणा मुझे दूसरों से मिलती है, हालांकि यह है कि यह उच्च भार के तहत बहुत अच्छा है, इसलिए इसे कई मशीनों में स्केल करना कुछ ऐसा नहीं है जिससे निपटने की आवश्यकता है।
  • 'दी-यू-मीन', आदि के लिए कोई समर्थन नहीं है - हालांकि ये आसानी से पर्याप्त अन्य उपकरणों के साथ किया जा सकता है। स्फिंक्स शब्द का उपयोग करता है, हालांकि शब्दकोशों का उपयोग करता है, इसलिए 'ड्राइविंग' और 'ड्राइव' (उदाहरण के लिए) को खोजों में समान माना जाएगा।
  • स्फिंक्स हालांकि क्षेत्र डेटा के लिए आंशिक सूचकांक अपडेट की अनुमति नहीं देता है। इसके लिए सामान्य दृष्टिकोण हाल के सभी परिवर्तनों के साथ एक डेल्टा सूचकांक बनाए रखना है, और हर बदलाव के बाद इसे फिर से अनुक्रमणित करना है (और वे नए परिणाम एक दूसरे या दो के भीतर दिखाई देते हैं)। डेटा की कम मात्रा के कारण, यह कुछ सेकंड का समय ले सकता है। आपको अभी भी मुख्य डेटासेट को नियमित रूप से फिर से अनुक्रमित करना होगा (हालाँकि नियमित रूप से आपके डेटा की अस्थिरता पर निर्भर करता है - हर? हर घंटे?)। तेज अनुक्रमण गति हालांकि यह सब बहुत दर्द रहित रखती है।

मुझे नहीं पता कि यह आपकी स्थिति के लिए कैसे लागू होता है, लेकिन इवान वीवर ने कुछ बेंचमार्क चलाने वाले सामान्य रेल खोज विकल्पों (स्फिंक्स, फेरेट (रूबी के लिए ल्यूसीन का एक बंदरगाह) और सोलर) की तुलना की। उपयोगी हो सकता है, मुझे लगता है।

मैंने MySQL के पूर्ण-पाठ खोज की गहराई को कम नहीं किया है, लेकिन मुझे पता है कि यह Sphinx, Lucene या Solr के साथ गति-वार या फ़ीचर-वार का मुकाबला नहीं करता है।


स्फिंक्स आपको वर्तमान अनुक्रमित में आइटमों की व्यक्तिगत विशेषताओं को अपडेट करने की अनुमति देता है, लेकिन पूर्ण रिकॉर्ड को हटा / अपडेट नहीं करता है।
Xorlev

स्फिंक्स आरटी आपको आंशिक अपडेट / निष्कासन करने की अनुमति देता है। यह प्रारंभिक अवस्था में है लेकिन पहले से ही [लगभग] काम करता है। sphinxsearch.com/wiki/doku.php?id=rt_tutorial
pQd

4
यहाँ सोलर पर एक उत्तर दिया गया है जो स्फिंक्स पर इस उत्तर के लिए एक अच्छी जोड़ी है
न्यू अलेक्जेंड्रिया

गति के लिए स्फिंक्स से कुछ भी मेल नहीं खा सकता है, इसलिए यदि गति आपकी नंबर एक चिंता है तो स्फिंक्स के लिए जाने का विकल्प है। अच्छी पोस्ट
टहनी

स्फिंक्स 2.3.2 बीटा में अब 'CALL SUGGEST' नाम की एक सुविधा है जिसे 'क्या आपका मतलब था' को लागू करने के लिए इस्तेमाल किया जा सकता है? sphinxsearch.com/docs/devel.html#sphinxql-call-suggest
विनोद के

82

मैं स्फिंक्स को नहीं जानता, लेकिन ल्यूसीन बनाम एक डेटाबेस पूर्ण-पाठ खोज के लिए, मुझे लगता है कि ल्यूसिन का प्रदर्शन बेजोड़ है। आपको लगभग कोई भी करने में सक्षम होना चाहिए 10 एमएस से कम में खोज , चाहे आपको कितने भी रिकॉर्ड की खोज करनी पड़े, बशर्ते आपने अपना ल्यूसीन इंडेक्स सही ढंग से सेट किया हो।

यहाँ हालांकि सबसे बड़ी बाधा आती है: व्यक्तिगत रूप से, मुझे लगता है कि आपकी परियोजना में ल्यूसीन को एकीकृत करना आसान नहीं है । निश्चित रूप से, इसे स्थापित करना बहुत कठिन नहीं है, इसलिए आप कुछ बुनियादी खोज कर सकते हैं, लेकिन यदि आप इसका सबसे अधिक लाभ उठाना चाहते हैं, तो इष्टतम प्रदर्शन के साथ, तो आपको निश्चित रूप से ल्यूसिन के बारे में एक अच्छी पुस्तक की आवश्यकता है।

CPU और RAM आवश्यकताओं के लिए, Lucene में खोज करना आपके CPU को बहुत अधिक कार्य नहीं करता है, हालाँकि आपका डेटा अनुक्रमणित है, हालाँकि आप ऐसा अक्सर नहीं करते हैं (शायद दिन में एक या दो बार), इसलिए ऐसा नहीं है बहुत बाधा है।

यह आपके सभी सवालों का जवाब नहीं देता है, लेकिन संक्षेप में, यदि आपके पास खोज करने के लिए बहुत अधिक डेटा है, और आप शानदार प्रदर्शन चाहते हैं, तो मुझे लगता है कि ल्यूसीन निश्चित रूप से जाने का रास्ता है। यदि आपके पास खोज के लिए उतना डेटा नहीं है, तो आप डेटाबेस पूर्ण-पाठ खोज के लिए भी जा सकते हैं। MySQL पूर्ण-पाठ खोज सेट करना निश्चित रूप से मेरी पुस्तक में आसान है।


10
स्फिंक्स की तुलना में, लूसेंस बहुत धीमी और भारी है। मैंने अपने प्रोजेक्ट में दोनों का इस्तेमाल किया था और मैं आखिरकार स्फिंक्स से चिपक गया। लूसेंस जावा में है, और यह स्फिंक्स की तुलना में बहुत अधिक सीपीयू और रैम लेता है।
फ़िओ अर्कार Lwin

25
मुझे यहाँ असहमत होना पड़ेगा। यदि आप एक सही सूचकांक बनाते हैं, तो ल्यूसीन तेजी से चमक रहा है। आप मूल रूप से कुछ ही मिलीसेकेंड में लाखों रिकॉर्ड पर एक उन्नत क्वेरी कर सकते हैं। आपको बस यह जानना होगा कि आप क्या कर रहे हैं। और ल्यूकिन जावा में है ... आपकी बात? .NET पोर्ट, Lucene.NET btw भी है।
रज्जी

15
लेकिन आपने स्पष्ट रूप से कहा कि आप स्फिंक्स का उपयोग नहीं करते हैं, और v3sson दोनों का उपयोग किया है।
user508546

20
आप यह कैसे कह सकते हैं कि ल्यूसीन का प्रदर्शन उसी वाक्य में बेजोड़ है, जिस पर आप कहते हैं कि आपने स्फिंक्स का उपयोग नहीं किया है?
user508546

22
मान्य सवाल। मैंने कभी नहीं कहा कि ल्यूसिन स्फिंक्स से तेज है, मैंने उल्लेख किया कि ल्यूसीन बनाम एक डेटाबेस पूर्ण-पाठ खोज बेजोड़ है। और यह है। उसके बारे में कोई सवाल नहीं। ल्यूसीन एक औंधा सूचकांक पर आधारित है। अब मैं स्फिंक्स को नहीं जानता, जैसा कि पहले उल्लेख किया गया है, लेकिन अगर यह एक उल्टे सूचकांक या इसी तरह की अनुक्रमण विधि का उपयोग करता है तो संभव है कि वे समान रूप से प्रदर्शन कर रहे हों। यह कहना कि ल्यूसीन, स्फिंक्स की तुलना में, 'थियो स्लो एंड बल्की' तथ्यों पर आधारित नहीं है। विशेष रूप से तब नहीं जब यह केवल कहा जाता है कि ल्यूसिन 'जावा' में है, जो प्रदर्शन के मामले में सिर्फ एक हास्यास्पद गैर-मुद्दा है।
रेजी

60

मुझे आश्चर्य है कि सोलर के बारे में अधिक जानकारी पोस्ट नहीं की गई है। Solr Sphinx से काफी मिलता-जुलता है, लेकिन इसमें और अधिक उन्नत विशेषताएं हैं (AFAIK क्योंकि मैंने Sphinx का उपयोग नहीं किया है - केवल इसके बारे में पढ़ा है)।

नीचे दिए गए लिंक पर दिए गए उत्तर में स्फिंक्स के बारे में कुछ बातें हैं जो सोलर पर भी लागू होती हैं। पूर्ण पाठ खोज इंजन की तुलना - Lucene, Sphinx, Postgresql, MySQL?

सोलर निम्नलिखित अतिरिक्त सुविधाएँ भी प्रदान करता है:

  1. प्रतिकृति का समर्थन करता है
  2. एकाधिक कोर (अपने स्वयं के कॉन्फ़िगरेशन और स्वयं के अनुक्रमित के साथ अलग डेटाबेस के रूप में सोचते हैं)
  3. बुलियन खोजता है
  4. कीवर्ड की हाइलाइटिंग (यदि आपके पास regex-fu है, तो आवेदन कोड में करना बहुत आसान है; हालाँकि, किसी विशेष टूल को आपके लिए बेहतर काम क्यों नहीं करने दिया जाता है)
  5. XML या सीमांकित फ़ाइल के माध्यम से अद्यतन सूचकांक
  6. HTTP के माध्यम से खोज सर्वर के साथ संचार करें (यह Json, मूल निवासी PHP / Ruby / Python भी लौटा सकता है)
  7. पीडीएफ, वर्ड डॉक्यूमेंट इंडेक्सिंग
  8. गतिशील क्षेत्र
  9. पहलुओं
  10. खेतों को अलग करना
  11. शब्द, पर्यायवाची शब्द आदि को रोकें।
  12. इस तरह से अधिक...
  13. कस्टम प्रश्नों के साथ डेटाबेस से सीधे सूचकांक
  14. स्वतः सुझाव
  15. कैशे ऑटोरार्मिंग
  16. फास्ट इंडेक्सिंग (MySQL फुल-टेक्स्ट सर्च इंडेक्सिंग समय की तुलना में) - ल्यूसिन एक बाइनरी उल्टे इंडेक्स प्रारूप का उपयोग करता है।
  17. बूस्टिंग (किसी विशेष कीवर्ड या वाक्यांश की प्रासंगिकता बढ़ाने के लिए कस्टम नियम, आदि)
  18. फ़ील्ड्ड खोजें (यदि कोई खोज उपयोगकर्ता उस फ़ील्ड को जानता है, जिसे वह खोजना चाहता है, तो उन्होंने फ़ील्ड को टाइप करके अपनी खोज को छोटा कर दिया, फिर मान, और केवल उस फ़ील्ड को हर चीज़ के बजाय खोजा जाता है - बहुत बेहतर उपयोगकर्ता अनुभव)

BTW, टन अधिक विशेषताएं हैं; हालाँकि, मैंने केवल उन विशेषताओं को सूचीबद्ध किया है जिनका मैंने वास्तव में उत्पादन में उपयोग किया है। BTW, बॉक्स से बाहर, MySQL ऊपर की सूची में # 1, # 3, और # 11 (सीमित) का समर्थन करता है। आप जिन सुविधाओं की तलाश कर रहे हैं, उनके लिए एक रिलेशनल डेटाबेस इसमें कटौती नहीं करेगा। मैं सीधे उन लोगों को खत्म कर देता।

इसके अलावा, एक और लाभ यह है कि सोलर (अच्छी तरह से, ल्यूसीन वास्तव में) एक दस्तावेज़ डेटाबेस (जैसे NoSQL) है, इसलिए किसी भी अन्य दस्तावेज़ डेटाबेस के कई लाभ सोलर के साथ महसूस किए जा सकते हैं। दूसरे शब्दों में, आप इसे केवल खोज (अर्थात प्रदर्शन) से अधिक के लिए उपयोग कर सकते हैं। इसके साथ रचनात्मक हो जाओ :)


Sphinx भी सपोर्ट रिप्लेसमेंट के बारे में मल्टीपल कोर बुलियन खोजों का उपयोग करता है कीवर्ड्स की हाइलाइटिंग XML -or सीमांकित फ़ाइल के माध्यम से अपडेट इंडेक्स- पीडीएफ, वर्ड डॉक्यूमेंट इंडेक्सिंग (xml के माध्यम से) पहलूएं, पर्यायवाची प्रश्नों के साथ डेटाबेस से सीधे शब्दों, समानार्थी, आदि को रोकें ऑटो-सुझाव फास्ट अनुक्रमित बूस्टिंग फ़ील्ड खोज गतिशील क्षेत्रों के बारे में अलग-अलग फ़ील्ड कैश करें स्वतः संचय मैं अभी नहीं जानता
Moosh

58

अपाचे सोलर


ओपी के प्रश्नों का उत्तर देने के अलावा, मैं अपाचे सोलर पर सरल इंट्रोडक्शन से विस्तृत इंस्टॉलेशन और कार्यान्वयन तक कुछ अंतर्दृष्टि फेंक देता हूं ।

सरल परिचय


जिस किसी को भी उपरोक्त खोज इंजन के साथ अनुभव हुआ है, या अन्य इंजन सूची में नहीं हैं - मुझे आपकी राय सुनना अच्छा लगेगा।

सोलर का उपयोग वास्तविक समय की समस्याओं को हल करने के लिए नहीं किया जाना चाहिए। खोज इंजन के लिए, सोलर बहुत ज्यादा खेल है और निर्दोष रूप से काम करता है

सोलर हाई ट्रैफिक वेब-एप्लिकेशन पर ठीक काम करता है ( मैंने कहीं पढ़ा कि यह इसके लिए अनुकूल नहीं है, लेकिन मैं उस कथन का समर्थन कर रहा हूं )। यह CPU का उपयोग करता है, CPU का नहीं।

  • परिणाम प्रासंगिकता और रैंकिंग

बढ़ावा आप रैंक अपने परिणामों को शीर्ष पर दिखाई दें मदद करता है। कहते हैं, आप पहले namename और lastname फ़ील्ड में एक नाम जॉन के लिए खोज करने की कोशिश कर रहे हैं , और आप firstname फ़ील्ड को प्रासंगिकता देना चाहते हैं , फिर आपको दिखाए गए अनुसार firstname फ़ील्ड को बढ़ावा देना होगा ।

http://localhost:8983/solr/collection1/select?q=firstname:john^2&lastname:john

जैसा कि आप देख सकते हैं, Firstname फ़ील्ड को 2 के स्कोर के साथ बढ़ाया गया है।

SolrRelevancy पर अधिक

  • खोज और अनुक्रमण गति

गति अविश्वसनीय रूप से तेज है और उस पर कोई समझौता नहीं है। जिस कारण मैं सोलर चला गया ।

अनुक्रमण गति के बारे में, Solr भी संभाल कर सकते हैं कार्यभार संभाला अपने डेटाबेस तालिकाओं से। एक उच्च और जटिल JOIN अनुक्रमण गति को प्रभावित करता है। हालांकि, एक विशाल रैम कॉन्फिग इस स्थिति से आसानी से निपट सकता है।

उच्चतर RAM, Solr की अनुक्रमण गति जितनी तेज़ होती है।

  • Django के साथ उपयोग में आसानी और एकीकरण में आसानी

सोलर और Django को एकीकृत करने का प्रयास कभी नहीं किया गया , हालांकि आप हेस्टैक के साथ ऐसा कर सकते हैं । मुझे उसी पर कुछ दिलचस्प लेख और यहाँ इसके लिए गितूब मिला

  • संसाधन आवश्यकताएँ - साइट को VPS पर होस्ट किया जाएगा, इसलिए आदर्श रूप से खोज इंजन को बहुत अधिक RAM और CPU की आवश्यकता नहीं होगी

Solr RAM पर प्रजनन करता है, इसलिए यदि RAM अधिक है, तो आपको Solr के बारे में चिंता करने की आवश्यकता नहीं है ।

सोलर का रैम उपयोग पूर्ण-अनुक्रमण पर होता है यदि आपके पास कुछ अरब रिकॉर्ड हैं, तो आप इस स्थिति से निपटने के लिए स्मार्ट तरीके से डेल्टा आयात का उपयोग कर सकते हैं। जैसा कि समझाया गया है, सोलर केवल एक वास्तविक समय समाधान है

  • scalability

सोलर अत्यधिक स्केलेबल है। SolrCloud पर एक नज़र है । इसकी कुछ प्रमुख विशेषताएं।

  • शेयर (या शार्पिंग कई मशीनों के बीच इंडेक्स को वितरित करने की अवधारणा है, कहते हैं कि क्या आपका इंडेक्स बहुत बड़ा हो गया है)
  • लोड संतुलन (यदि Solrj) सोलर क्लाउड के साथ का उपयोग किया जाता है यह स्वचालित रूप से राउंड-रॉबिन तंत्र का उपयोग करके लोड-संतुलन का ख्याल रखता है)
  • वितरित खोज
  • उच्च उपलब्धता
  • अतिरिक्त विशेषताएं जैसे "क्या आपका मतलब था?", संबंधित खोजें, आदि

उपरोक्त परिदृश्य के लिए, आप SpellCheckComponent का उपयोग कर सकते हैं जो Solr के साथ पैक किया गया है । वहाँ एक बहुत अन्य विशेषताएं हैं, SnowballPorterFilterFactory रिकॉर्ड कहते हैं कि आप लिखकर, पुनः प्राप्त करने में मदद करता है पुस्तकों के बजाय किताब , आप से संबंधित परिणामों के साथ प्रस्तुत किया जाएगा किताब


यह जवाब मोटे तौर पर Apache Solr & MySQL पर केंद्रित है । Django के दायरे से बाहर है।

यह मानते हुए कि आप LINUX वातावरण में हैं, आप इस लेख को आगे बढ़ा सकते हैं। (मेरा एक Ubuntu 14.04 संस्करण था)

विस्तृत स्थापना

शुरू करना

डाउनलोड अपाचे Solr से यहाँ । यह संस्करण 4.8.1 होगा । आप नए संस्करण डाउनलोड कर सकते हैं, मुझे यह स्थिर लगा।

संग्रह को डाउनलोड करने के बाद, इसे अपनी पसंद के फ़ोल्डर में निकालें। कहो .. Downloadsया जो भी हो .. तो ऐसा ही लगेगाDownloads/solr-4.8.1/

अपने संकेत पर .. निर्देशिका के अंदर नेविगेट करें

shankar@shankar-lenovo: cd Downloads/solr-4.8.1

तो अब आप यहाँ हैं ।।

shankar@shankar-lenovo: ~/Downloads/solr-4.8.1$

जेट्टी एप्लिकेशन सर्वर शुरू करें

जेट्टी निर्देशिका के उदाहरण फ़ोल्डर के अंदर उपलब्ध है solr-4.8.1, इसलिए उसके अंदर नेविगेट करें और जेट्टी एप्लिकेशन सर्वर शुरू करें।

shankar@shankar-lenovo:~/Downloads/solr-4.8.1/example$ java -jar start.jar

अब, टर्मिनल को बंद न करें, इसे कम से कम करें और इसे एक तरफ रहने दें।

(TIP: जेट्टी सर्वर को बैकग्राउंड में चलाने के लिए start.jar के बाद का उपयोग करें)

यह जाँचने के लिए कि क्या अपाचे सोलर सफलतापूर्वक चलता है, ब्राउज़र पर इस URL पर जाएँ।http: // localhost: 8983 / Solr

कस्टम पोर्ट पर जेट्टी चल रहा है

यह डिफ़ॉल्ट रूप में पोर्ट 8983 पर चलता है। आप यहाँ या सीधे jetty.xmlफ़ाइल के अंदर पोर्ट बदल सकते हैं ।

java -Djetty.port=9091 -jar start.jar

JConnector डाउनलोड करें

यह JAR फ़ाइल MySQL और JDBC के बीच एक सेतु का काम करती है , यहाँ प्लेटफ़ॉर्म इंडिपेंडेंट वर्जन डाउनलोड करें

इसे डाउनलोड करने के बाद, फोल्डर को निकालें और कॉपी करें mysql-connector-java-5.1.31-bin.jarऔर इसे लेबर डायरेक्टरी में पेस्ट करें ।

shankar@shankar-lenovo:~/Downloads/solr-4.8.1/contrib/dataimporthandler/lib

माईएसक्यूएल टेबल बनाना अपाचे सोलर से जोड़ा जाना है

उपयोग करने के लिए सोलर डालने के लिए, आपको खोज करने के लिए कुछ तालिकाओं और डेटा की आवश्यकता है। उसके लिए, हम एक तालिका बनाने और कुछ यादृच्छिक नामों को आगे बढ़ाने के लिए MySQL का उपयोग करेंगे और फिर हम Solr का उपयोग कर सकते हैं को MySQL से कनेक्ट करने के लिए और उस तालिका को अनुक्रमणित कर सकते हैं।

1.बल संरचना

CREATE TABLE test_solr_mysql
 (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  name VARCHAR(45) NULL,
  created TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id)
 );

2. उपर्युक्त तालिका का अनुकरण करें

INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jean');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jack');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jason');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Vego');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Grunt');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jasper');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Fred');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jenna');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Rebecca');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Roland');

कोर के अंदर हो रही है और काम के निर्देशों को जोड़ने

1. करने के लिए उपलब्ध है

shankar@shankar-lenovo: ~/Downloads/solr-4.8.1/example/solr/collection1/conf

2. Solrconfig.xml को संशोधित करना

इस फ़ाइल में इन दोनों निर्देशों को जोड़ें ..

  <lib dir="../../../contrib/dataimporthandler/lib/" regex=".*\.jar" />
  <lib dir="../../../dist/" regex="solr-dataimporthandler-\d.*\.jar" />

अब DIH (डेटा आयात हैंडलर) जोड़ें

<requestHandler name="/dataimport" 
  class="org.apache.solr.handler.dataimport.DataImportHandler" >
    <lst name="defaults">
      <str name="config">db-data-config.xml</str>
    </lst>
</requestHandler>

3. db-data-config.xml फ़ाइल बनाएँ

यदि फ़ाइल मौजूद है तो अनदेखा करें, इन पंक्तियों को उस फ़ाइल में जोड़ें। जैसा कि आप पहली पंक्ति देख सकते हैं, आपको अपने MySQL डेटाबेस के क्रेडेंशियल्स प्रदान करने की आवश्यकता है । डेटाबेस का नाम, उपयोगकर्ता नाम और पासवर्ड।

<dataConfig>
    <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/yourdbname" user="dbuser" password="dbpass"/>
    <document>
   <entity name="test_solr" query="select CONCAT('test_solr-',id) as rid,name from test_solr_mysql WHERE '${dataimporter.request.clean}' != 'false'
      OR `created` > '${dataimporter.last_index_time}'" >
    <field name="id" column="rid" />
    <field name="solr_name" column="name" />
    </entity>
   </document>
</dataConfig>

(TIP: आपके पास कितनी भी इकाइयाँ हो सकती हैं, लेकिन id फ़ील्ड के लिए देखें, यदि वे समान हैं तो इंडेक्सिंग छोड़ दी जाएगी।)

4. स्कीमा.xml फ़ाइल को संशोधित करें

दिखाए अनुसार इसे अपने स्कीमा.एक्सएमएल में जोड़ें ।।

<uniqueKey>id</uniqueKey>
<field name="solr_name" type="string" indexed="true" stored="true" />

कार्यान्वयन

इंडेक्सिंग

यहीं पर असली सौदा होता है। आप से डेटा का अनुक्रमण करने की ज़रूरत है MySQL के लिए Solr Solr क्वेरी की मेकअप उपयोग करने के लिए inorder।

चरण 1: सोलर व्यवस्थापक पैनल पर जाएं

अपने ब्राउज़र पर URL http: // localhost: 8983 / solr मारो । स्क्रीन इस तरह से खुलती है।

यह मुख्य अपाचे सोलर एडमिनिस्ट्रेशन पैनल है

जैसे ही मार्कर इंगित करता है, लॉगिंग पर जाएं उपरोक्त विन्यास में से किसी में त्रुटियों की वजह से जाँच करने के इनवर्टर पर जाएं।

चरण 2: अपने लॉग की जाँच करें

ठीक है तो अब आप यहाँ हैं, जैसा कि आप बहुत सारे पीले संदेश (चेतावनी) कर सकते हैं। सुनिश्चित करें कि आपके पास लाल रंग में चिह्नित त्रुटि संदेश नहीं हैं। इससे पहले, हमारे कॉन्फ़िगरेशन पर हमने अपने db-data-config.xml पर एक चुनिंदा क्वेरी जोड़ी थी , कहते हैं कि अगर उस क्वेरी पर कोई त्रुटि थी, तो यह यहाँ दिखाया गया होगा।

यह आपके अपाचे सोलर इंजन का लॉगिंग सेक्शन है

ठीक है, कोई त्रुटि नहीं। हम जाने के लिए अच्छे हैं। आइए सूची में से संग्रह 1 को दर्शाए गए अनुसार चुनें और डेटाइमपोर्ट चुनें

चरण 3: DIH (डेटा आयात हैंडलर)

DIH, आप कनेक्ट हो जाएगा का उपयोग MySQL से Solr विन्यास फाइल के माध्यम से db-डेटा-config.xml से Solr इंटरफेस और जिस पर अनुक्रमित हो जाता है डेटाबेस से 10 रिकॉर्ड को पुनः प्राप्त Solr

ऐसा करने के लिए, पूर्ण-आयात चुनें , और स्वच्छ और प्रतिबद्ध विकल्पों की जाँच करें । अब Execute पर क्लिक करें दिखाए अनुसार ।

वैकल्पिक रूप से, आप इस तरह एक प्रत्यक्ष पूर्ण-आयात क्वेरी का उपयोग कर सकते हैं ।

http://localhost:8983/solr/collection1/dataimport?command=full-import&commit=true

डेटा आयात हैंडलर

आपके द्वारा निष्पादित किए जाने के बाद , सोलर ने रिकॉर्ड्स को अनुक्रमित करना शुरू कर दिया है, अगर कोई त्रुटि थी, तो यह इंडेक्सिंग विफल कहेगा और आपको लॉगिंग पर वापस जाना होगा अनुभाग क्या चला गया है गलत है देखने के लिए।

यह मानते हुए कि इस कॉन्फ़िगरेशन में कोई त्रुटि नहीं है और यदि अनुक्रमण सफलतापूर्वक पूरा हो गया है।, आपको यह सूचना मिलेगी।

अनुक्रमण सफलता

चरण 4: सोलर क्वेरी चलाना

ऐसा लगता है कि सब कुछ ठीक हो गया है, अब आप Solr Queries का उपयोग उस डेटा को क्वेरी करने के लिए कर सकते हैं जो अनुक्रमित था। बाईं ओर स्थित क्वेरी पर क्लिक करें और फिर निष्पादित करें दबाएं नीचे बटन ।

आप दिखाए गए अनुसार अनुक्रमित रिकॉर्ड देखेंगे।

सभी रिकॉर्ड को सूचीबद्ध करने के लिए संबंधित सोलर क्वेरी है

http://localhost:8983/solr/collection1/select?q=*:*&wt=json&indent=true

अनुक्रमित डेटा

खैर, वहाँ सभी 10 अनुक्रमित रिकॉर्ड चला जाता है। कहो, हमें केवल Ja से शुरू होने वाले नामों की आवश्यकता है , इस मामले में, आपको स्तंभ नाम को लक्षित करने की आवश्यकता है solr_name, इसलिए आपकी क्वेरी इस तरह से जाती है।

http://localhost:8983/solr/collection1/select?q=solr_name:Ja*&wt=json&indent=true

JSON डेटा Ja * से शुरू होता है

इसी तरह से आप Solr Queries लिखते हैं । इसके बारे में अधिक पढ़ने के लिए, इस सुंदर लेख को देखें


3
@Downvoter, बेझिझक टिप्पणी या इस जवाब को संपादित करने और डाउनवोट के लिए तर्क करने से दूसरों को भी मदद मिलेगी।
शंकर दामोदरन

4
यह सबसे व्यापक और अच्छी तरह से संगठित पदों में से एक है जो मैंने एसओ पर देखा है। शानदार कार्य।
पतित

28

मैं अभी PostgreSQL पूर्ण-पाठ खोज को देख रहा हूं, और इसमें एक आधुनिक खोज इंजन की सभी सही विशेषताएं हैं, वास्तव में अच्छा विस्तारित चरित्र और बहुभाषी समर्थन, डेटाबेस में पाठ क्षेत्रों के साथ अच्छा तंग एकीकरण।

लेकिन इसके पास उपयोगकर्ता-अनुकूल खोज ऑपरेटर जैसे + या AND (उपयोग करता है!) नहीं है और मैं इससे रोमांचित नहीं हूं कि यह उनके प्रलेखन स्थल पर कैसे काम करता है। हालांकि इसके परिणाम स्निपेट में मैच की शर्तों की बडिंग होती है, लेकिन डिफ़ॉल्ट एल्गोरिथ्म जिसके लिए मैच की शर्तें महान नहीं होती हैं। इसके अलावा, यदि आप rtf, PDF, MS Office को अनुक्रमणित करना चाहते हैं, तो आपको एक फ़ाइल प्रारूप कनवर्टर ढूंढना और एकीकृत करना होगा।

OTOH, यह MySQL पाठ खोज से बेहतर है, जो तीन अक्षरों या उससे कम के शब्दों को भी अनुक्रमणित नहीं करता है। यह MediaWiki खोज के लिए डिफ़ॉल्ट है, और मुझे वास्तव में लगता है कि यह अंतिम उपयोगकर्ताओं के लिए अच्छा नहीं है: http://www.searchtools.com/analysis/mediawiki-search/

सभी मामलों में मैंने देखा है, ल्यूसीन / सोलर और स्फिंक्स वास्तव में महान हैं । वे ठोस कोड हैं और प्रयोज्य में महत्वपूर्ण सुधार के साथ विकसित हुए हैं, इसलिए खोज करने के लिए उपकरण सभी हैं जो लगभग सभी को संतुष्ट करते हैं।

SHAILI के लिए - SOLR में ल्यूसीन खोज कोड लाइब्रेरी शामिल है और इसमें एक अच्छा स्टैंड-अलोन सर्च इंजन होने के लिए घटक हैं।


1
मेरा मानना ​​है कि PostgreSQL पूर्ण-पाठ खोज द्वारा आप का उल्लेख कर रहे हैं Tsearch। लेकिन Tsearch वाक्यांश खोज का समर्थन नहीं करता है । यह अभी भी उनकी TODO सूची sai.msu.su/~megera/wiki/FTS_Todo पर है
ज्ञानम

1
बस पोस्टग्रेज 9.0 पर पूर्ण पाठ खोज पर परीक्षण का एक गुच्छा किया; यह पता लगाने के लिए निराश था कि यदि उपयोगकर्ता सभी लहजे को भूल जाता है, तो फ्रांसीसी पाठ का मिलान नहीं किया जाता है। शब्द रूपों का मिलान पैची है - उदाहरण के लिए, अंग्रेजी में "कहते हैं" पाठ से मेल नहीं खाता "कहा"। कुल मिलाकर काफी प्रभावशाली है, हालांकि परीक्षण की गई भाषाओं (एकीकृत, fr, ru) में एक एकीकृत सुविधा के लिए।
रोमन स्टार्कोव

9
@romkyns: आपको उन्हें अलग करने के लिए एक अनौपचारिक शब्दकोष स्थापित करने की आवश्यकता है।
डेनिस डे बर्नार्डी

2
"ओटोह, यह MySQL टेक्स्ट सर्च से बेहतर है, जो तीन अक्षरों या उससे कम के शब्दों को भी इंडेक्स नहीं करता है।" यह MySQL का बिल्ट-इन प्रतिबंध नहीं है - यह आप जो भी कॉन्फ़िगर फाइल में सेट करते हैं। यदि आप एक अक्षर वाले शब्दों को अनुक्रमित करना चाहते हैं, तो बस एक मान को विन्यास में बदलें।
कैनकन

1
यह चिंताजनक है कि लोग उन डेटाबेसों की तुलना कर रहे हैं जो उन्होंने अभी तक पूरी तरह से नहीं खोजे हैं। MySQL CAN शब्दों को तीन अक्षरों या उससे कम के साथ अनुक्रमित कर सकता है - आपको बस इसे ठीक से कॉन्फ़िगर करना होगा।
theCarver

22

बस इस बहुत पुराने सवाल पर मेरे दो सेंट। मैं अत्यधिक लोचदार खोज पर एक नज़र डालने की सलाह दूंगा

एलिस्टिक्स एक खोज सर्वर है जो ल्यूसिन पर आधारित है। यह एक Restful वेब इंटरफेस और स्कीमा मुक्त JSON दस्तावेज़ों के साथ एक वितरित, बहु-सक्षम-पूर्ण पूर्ण-पाठ खोज इंजन प्रदान करता है। Elasticsearch जावा में विकसित किया गया है और अपाचे लाइसेंस की शर्तों के तहत खुले स्रोत के रूप में जारी किया गया है।

अन्य एफटीएस (पूर्ण पाठ खोज) इंजन पर लाभ हैं:

  • उत्साहपूर्ण इंटरफ़ेस
  • बेहतर स्केलेबिलिटी
  • बड़ा समुदाय
  • Lucene डेवलपर्स द्वारा निर्मित
  • व्यापक प्रलेखन
  • कई ओपन सोर्स लाइब्रेरी उपलब्ध हैं (जिनमें Django भी शामिल है)

हम अपने प्रोजेक्ट में इस खोज इंजन का उपयोग कर रहे हैं और इससे बहुत खुश हैं।


10

SearchTools-Avi ने कहा "MySQL टेक्स्ट सर्च, जो तीन अक्षरों या उससे कम शब्दों को भी इंडेक्स नहीं करता है।"

FYIs, MySQL फुलटेक्स मिनट शब्द की लंबाई कम से कम MySQL 5.0 के बाद से समायोज्य है । सरल निर्देशों के लिए Google 'mysql fulltext min length'।

उस ने कहा, माईएसक्यूएल फुलटेक्स्ट की सीमाएँ हैं: एक के लिए, एक बार या एक लाख रिकॉर्ड तक पहुँचने के बाद इसे अपडेट करना धीमा हो जाता है, ...


2

मैं mnoGoSearch जोड़ूंगा सूची में । अत्यधिक प्रदर्शन करने वाला और लचीला समाधान, जो Google के रूप में काम करता है: कई साइटों से डेटा प्राप्त करता है, आप बुनियादी मानदंडों का उपयोग कर सकते हैं, या अधिकतम खोज गुणवत्ता के लिए अपने स्वयं के हुक का आविष्कार कर सकते हैं। इसके अलावा यह डेटा को सीधे डेटाबेस से प्राप्त कर सकता है।

समाधान आज ज्ञात नहीं है, लेकिन यह अधिकतम आवश्यकताओं की पूर्ति करता है। आप इसे संकलित कर सकते हैं या इसे स्थापित कर सकते हैं या स्टैंडअलोन सर्वर पर, या यहां तक ​​कि आपके प्रमुख सर्वर पर, इसे सोल के रूप में बहुत सारे स्रोतों की आवश्यकता नहीं है, क्योंकि यह सी में लिखा गया है और छोटे सर्वरों पर भी पूरी तरह से चलता है।

शुरुआत में आपको इसे स्वयं संकलित करने की आवश्यकता है, इसलिए इसे कुछ ज्ञान की आवश्यकता है। मैंने डेबियन के लिए एक छोटी स्क्रिप्ट बनाई , जो मदद कर सकती है। किसी भी समायोजन का स्वागत है।

जैसा कि आप Django ढांचे का उपयोग कर रहे हैं, आप बीच में या PHP क्लाइंट का उपयोग कर सकते हैं, या पायथन में एक समाधान पा सकते हैं, मैंने कुछ लेख देखे ।

और, निश्चित रूप से mnoGoSearch खुला स्रोत है, GNU GPL।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.