पूर्ण खोज InnoDB के साथ


93

मैं एक हाई-वॉल्यूम वेब एप्लिकेशन विकसित कर रहा हूं, जहां इसका एक हिस्सा चर्चा पोस्टों का एक MySQL डेटाबेस है जिसे 20M + पंक्तियों तक आसानी से बढ़ने की आवश्यकता होगी।

मैं मूल रूप से तालिकाओं के लिए MyISAM (बिल्ट-इन फुलटेक्स्ट सर्च क्षमताओं के लिए ) का उपयोग करने की योजना बना रहा था , लेकिन एकल लेखन ऑपरेशन के कारण पूरी तालिका के बंद होने के बारे में सोचा जाना मुझे शटर कर देता है। पंक्ति-स्तरीय ताले बहुत अधिक अर्थ देते हैं (विशाल तालिकाओं के साथ काम करते समय इनोबीडी के अन्य गति लाभों का उल्लेख नहीं करने के लिए)। तो, इस कारण से, मैं InnoDB का उपयोग करने के लिए बहुत दृढ़ हूं।

समस्या यह है ... InnoDB में पूर्ण-खोज क्षमताओं में अंतर्निहित नहीं है।

क्या मुझे थर्ड-पार्टी सर्च सिस्टम के साथ जाना चाहिए? ल्यूसिने की तरह (c ++) / स्फिंक्स ? क्या आप में से किसी ने डेटाबेस निन्जा के पास कोई सुझाव / मार्गदर्शन है?लिंक्डइन का ज़ोइ ( लूसिन के आधार पर) इस समय सबसे अच्छा विकल्प लगता है... realtime क्षमताओं के आसपास बनाया गया है (जो मेरे आवेदन के लिए बहुत महत्वपूर्ण है।) मैं कुछ अंतर्दृष्टि के बिना अभी तक करने के लिए थोड़ा संकोच कर रहा हूँ ...

(FYI करें: उच्च मेमोरी रिग्स के साथ EC2 पर होने जा रहा है, फ्रंटएंड की सेवा के लिए PHP का उपयोग करके)


जवाबों:


50

मैं MyISAM फुलटेक्स के लिए एक बुरा विकल्प हो सकता है - यहां तक ​​कि सामान्य रूप से MyISAM टेबल्स के साथ विभिन्न समस्याओं को छोड़कर, मैंने फुलटेक्स सामान को रेल से जाते हुए देखा और खुद को दूषित करना शुरू कर दिया और MySQL को नियमित रूप से क्रैश कर दिया।

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

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


7
Solr (Lucene पर आधारित) बेहद पैमाने पर और इसके बहुत शक्तिशाली और लचीले हो सकते हैं। हमने सोलर (विशेष रूप से सोलर संस्करण के लिए ल्यूसिडवर्क्स) को नियोजित किया है और मैं कह सकता हूं कि यह बहुत बड़ी जीत है। स्फिंक्स के पास कुछ गंभीर वादे भी हैं, लेकिन अंततः इसकी कमी के कारण हमारे आवेदन कम से कम परेशान हो सकते हैं। स्फिंक्स बहुत तेज है और अगर यह आपकी आवश्यकताओं के अनुसार फिट बैठता है तो यह एक ठोस विकल्प है।
कॉडी कॉगलन

धन्यवाद एक गुच्छा आप दो; शानदार प्रतिक्रियाएं। मैं सोलर के डॉक्स के माध्यम से अंगूठा लगा रहा हूं, और, ऐसा लगता है कि एक महान समाधान के साथ जाना है। यह काफी बड़ी वेबसाइटों को भी अधिकार देता है, मैं देखता हूं। मुझे लगता है कि सोलर का टिकट। धन्यवाद दोस्तों। इसके अलावा, यह आपके MyISAM सिरदर्द, इयान ... के बारे में जानने के लिए अच्छा है ... जो भविष्य में ध्यान में रखना अच्छा होगा। अन्य परियोजनाओं पर, मैं फुलटेक्स्ट फीचर का उपयोग करने की कोशिश कर रहा हूं।
brianreavis 2

11
सोच रहा था कि इयान ने क्या कहा कि "यह मत समझो कि क्ल्यूसीन बेहतर होगा"? Clucene कोर टीम में से एक के रूप में मैं इतना उद्देश्य नहीं हो सकता है, लेकिन मुझे लगता है कि यह किसी भी जावा लाइब्रेरी के C ++ पोर्ट को अनुकूलित करता है यह छत के माध्यम से प्रदर्शन को बढ़ावा देगा। मैं किसी को भी इस तरह की टिप्पणियों को पोस्ट करने की सलाह नहीं दूंगा कि वे जिस उत्पाद को बदनाम कर रहे हैं उस पर कम से कम नज़र डालें।
सिन्धेश्को

4
जब आप MyISAM को स्लैम करते हैं, तो आपको वास्तव में अधिक विशिष्ट होने की आवश्यकता होती है। "रेल से दूर" बहुत अस्पष्ट है, और हो सकता है क्योंकि निर्माण में एक भी बग संभवतया तय होने के बाद से आप उपयोग कर रहे थे।
बोब्बोबो

6
लेकिन क्या होगा यदि आपके पास सर्वर पर सॉफ़्टवेयर स्थापित करने का विकल्प नहीं है - इस मामले में क्या विकल्प मौजूद हैं?
acme

56

MyISAM से बाहर चरणबद्ध तरीके से, InnoDB पूर्ण-पाठ खोज (FTS) अंततः MySQL 5.6 रिलीज में उपलब्ध है।

Https://dev.mysql.com/doc/refman/5.6/en/innodb-fulltext-index.html पर रसदार विवरण के बहुत सारे ।

जबकि अन्य इंजनों में बहुत सारी विशेषताएं हैं, यह एक InnoDB है, इसलिए यह देशी है (जिसका अर्थ है कि एक उन्नयन पथ है), और यह इसे एक सार्थक विकल्प बनाता है।


1
अनुच्छेद लिंक 403 निषिद्ध है
मार्को डेमायो

11

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

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

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


धन्यवाद, बिल। हाँ, स्फिंक्स डॉक्यूमेंटेशन ने मुझे थोड़ा सा डरा दिया था कि यह इंडेक्स अपडेट को कैसे हैंडल करता है। यह पुष्टि करने के लिए अच्छा है। इस तरह की प्रणाली शायद मेरे लिए बुरे सपने में बदल जाएगी, मैं कल्पना करता हूं। Google कस्टम खोज के लिए, यह एक विकल्प है। हालांकि, इसके साथ मेरी मुख्य समस्या सिर्फ गैर-वास्तविक समय सूचकांक और अनुकूलन की कमी है। परिणामों को स्टाइल करना और अतिरिक्त डेटा खींचना मेरे लिए काफी महत्वपूर्ण होगा। हालांकि में chiming के लिए धन्यवाद --- स्फिंक्स जानकारी निश्चित रूप से पता करने के लिए अच्छा है!
ब्रायनरीविस

3

शायद आपको MySQL के FT को इतनी जल्दी खारिज नहीं करना चाहिए। क्रेगलिस्ट इसका इस्तेमाल करते थे

MySQL की गति और पूर्ण पाठ खोज ने अपने उपयोगकर्ताओं की सेवा करने के लिए क्रेगलिस्ट को सक्षम किया है .. प्रति सेकंड 60 खोज तक की दर से प्रति माह लगभग 50 मिलियन खोजों की सेवा करने के लिए craigslist MySQL का उपयोग करता है। "

संपादित करें

जैसा कि नीचे टिप्पणी की गई है, क्रेगलिस्ट ने लगता है कि 2009 की शुरुआत में कुछ समय के लिए स्फिंक्स पर स्विच किया था।


मेरे द्वारा जोड़ा गया लेख स्फिंक्स का उल्लेख नहीं करता है, और निक किसी भी स्रोत का हवाला नहीं देता है कि क्रेगलिस्ट ने स्फिंक्स का उपयोग किया है
बॉबोबोब

केस स्टडी पीडीएफ 2004 से दिखता है, उस समय प्रति माह 50M खोज होती थी। स्फिंक्स पेज प्रति दिन 50M खोजों को बताता है , जो संभवतः एक समर्पित खोज समाधान पर स्विच करने का कारण बताते हैं।
हेलिल Hal ज़गर

1

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



0

आपको स्फिंक्स पर एक नज़र रखना चाहिए। यह एक कोशिश के योग्य है। यह अनुक्रमण सुपर फास्ट है और इसे वितरित किया जाता है। आपको इस (http://www.percona.com/webinars/2012-08-22-full-text-search-throwdown) वेबमिनार पर एक नज़र डालनी चाहिए। यह खोज के बारे में बात करता है और इसमें कुछ साफ-सुथरे बेंचमार्क हैं। आपको यह मददगार लग सकता है।



0

MySQL / MariaDB (यानी CentOS उपयोगकर्ता) के पुराने संस्करण पर अटके किसी के लिए, जहाँ InnoDB Fulltext खोजों का समर्थन नहीं करता है, InnoDB तालिकाओं का उपयोग करते समय मेरा समाधान उस चीज़ के लिए एक अलग MyISAM तालिका बनाना था जिसे मैं खोजना चाहता था।

उदाहरण के लिए, मेरी मुख्य InnoDB तालिका productsविभिन्न कुंजियों और संदर्भात्मक अखंडता के साथ थी। मैंने तब एक साधारण MyISAM तालिका बनाई product_search, जिसमें दो फ़ील्ड शामिल थे, product_idऔर product_nameजहां बाद को एक FULLTEXTइंडेक्स पर सेट किया गया था । दोनों फ़ील्ड मुख्य productतालिका में प्रभावी रूप से कॉपी हैं ।

मैं तब फुलटेक्स्ट का उपयोग करके MyISAM टेबल पर खोज करता हूं, और इनोबीडी टेबल पर वापस इनर जॉइन करता हूं।

MyISAM तालिका की सामग्री को ट्रिगर या एप्लिकेशन के मॉडल के माध्यम से अद्यतित रखा जा सकता है।

यदि आपके पास फ़ुलटेक्स्ट की आवश्यकता है, तो आपके पास यह सुझाव नहीं होगा, लेकिन एकल तालिका के लिए यह पर्याप्त कार्य की तरह लगता है जब तक कि आप अपग्रेड नहीं कर सकते।

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