क्या कोई खुले स्रोत या वाणिज्यिक उपकरण उपलब्ध हैं जो डेटाबेस सामग्री के टेक्स्ट खंड अनुक्रमण अनुक्रमण की अनुमति देते हैं और जावा से पूछे जा सकते हैं?डेटाबेस में टेक्स्ट टुकड़े की खोज कैसे करें
प्रश्न की पृष्ठभूमि एक बड़ी MySQL डेटाबेस तालिका है जिसमें कई सौ हजार रिकॉर्ड हैं, जिनमें कई VARCHAR कॉलम हैं। इन कॉलम में लोग सामग्री के टुकड़ों की खोज करना चाहते हैं, इसलिए एक पूर्ण टेक्स्ट इंडेक्स (जो शब्द सीमाओं पर आधारित है) मदद नहीं करेगा।
संपादित: [स्पष्ट करना क्यों इन पहला सुझाव समस्या का समाधान नहीं होता जोड़ा गया:]
यही कारण है कि MySQL के प्रतिलिपि प्राप्त सूचकांक में बनाया काम नहीं करेगा, और न Lucene या स्फिंक्स जाएगा, सभी जिनमें से जवाब में सुझाव दिया गया था। मैंने पहले से ही उन दोनों को देखा है, लेकिन जहां तक मैं कह सकता हूं, ये इंडेक्सिंग शब्द पर आधारित हैं, स्टॉप शब्दों को छोड़कर और वास्तविक पूर्ण टेक्स्ट खोज के लिए सभी प्रकार की समझदार चीजें कर रहे हैं। हालांकि यह उपयुक्त नहीं है, क्योंकि मैं "ओशन" जैसे खोज शब्द की तलाश कर रहा हूं, जिसे "रोइसनिक स्ट्रीट" और "जहर-आइवी" से मेल खाना चाहिए। यहां महत्वपूर्ण अंतर यह है कि खोज शब्द केवल कॉलम सामग्री का खंड है, जिसे किसी विशेष वर्ण या सफेद स्थान से सीमित नहीं किया जाना चाहिए।
EDIT2: [कुछ और पृष्ठभूमि जानकारी जोड़ा गया:] का अनुरोध सुविधा है कि यह एक व्यापार प्रबंधन प्रणाली में आइटम विवरण के लिए एक बहुत ढीला खोज है आधारित लागू किया जाना। उपयोगकर्ता अक्सर सही आइटम नंबर नहीं जानते हैं, लेकिन आइटम के नाम का केवल एक हिस्सा हैं। दुर्भाग्यवश इन विवरणों की गुणवत्ता कम है, वे विरासत प्रणाली से आती हैं और आसानी से नहीं बदला जा सकता है। उदाहरण के लिए लोग एक स्लेज हथौड़ा खोज रहे थे, वे "स्लेज" दर्ज करेंगे। एक शब्द/टोकन आधारित इंडेक्स के साथ यह "स्लेजहैमर" के रूप में संग्रहीत मैचों को नहीं मिलेगा, लेकिन केवल वे "स्लेज हथौड़ा" सुनते हैं। ऐसे सभी प्रकार के अजीब भिन्नताएं हैं जिन्हें कवर करने की आवश्यकता है, जिससे टोकन आधारित दृष्टिकोण अव्यवहारिक हो।
वर्तमान में केवल एक चीज है जो हम कर सकते हैं LIKE '%searchterm%'
क्वेरी है, जो प्रभावी रूप से किसी भी इंडेक्स उपयोग को अक्षम कर रही है और बहुत सारे संसाधन और समय की आवश्यकता है।
आदर्श रूप से ऐसा कोई भी टूल एक इंडेक्स तैयार करेगा जो मुझे ऐसे प्रश्नों के लिए परिणाम प्राप्त करने की अनुमति देता है, ताकि मैं स्पॉटलाइट जैसी खोज को कार्यान्वित कर सकूं, केवल प्राथमिक कुंजी के माध्यम से MySQL तालिका से "असली" डेटा पुनर्प्राप्त कर सकता हूं जब कोई उपयोगकर्ता परिणाम रिकॉर्ड चुनता है।
यदि संभव हो तो सूचकांक को अद्यतन करने योग्य (बिना पूर्ण पुनर्निर्माण की आवश्यकता के) होना चाहिए, क्योंकि डेटा बदल सकता है और अन्य ग्राहकों द्वारा तुरंत खोज के लिए उपलब्ध होना चाहिए।
मुझे सिफारिशें और/या अनुभव रिपोर्ट प्राप्त करने में खुशी होगी।
EDIT3: वाणिज्यिक समाधान पाया गया कि "सिर्फ काम करता है" हालांकि मैं इस सवाल के लिए अच्छा जवाब का एक बहुत हो गया, मैं यहाँ ध्यान दें, कि अंत में हम एक व्यावसायिक उत्पाद "QuickFind" कहा जाता है के साथ चला गया चाहता था , "एचएमबी डेंटेंटेनिक" नाम की एक जर्मन कंपनी द्वारा बनाई गई और बेची गई। कृपया ध्यान दें कि मैं किसी भी तरह से संबद्ध नहीं हूं, क्योंकि ऐसा लगता है कि जब मैं जाता हूं और वर्णन करता हूं कि उनका उत्पाद क्या कर सकता है। दुर्भाग्यवश उनके website बल्कि खराब दिखते हैं और केवल जर्मन ही हैं, लेकिन उत्पाद ही वास्तव में महान है। मेरे पास वर्तमान में उनमें से एक परीक्षण संस्करण है - आपको उनसे संपर्क करना होगा, कोई डाउनलोड नहीं - और मैं बेहद प्रभावित हूं।
चूंकि ऑनलाइन कोई व्यापक दस्तावेज उपलब्ध नहीं है, इसलिए मैं अब तक अपने अनुभवों का प्रयास और वर्णन करूंगा।
वे क्या करते हैं डेटाबेस सामग्री के आधार पर एक कस्टम इंडेक्स फ़ाइल बनाते हैं। वे ओडीबीसी के माध्यम से एकीकृत कर सकते हैं, लेकिन मुझे बताया गया है कि ग्राहकों को शायद ही कभी ऐसा ही किया जाता है। इसके बजाए - और यही वह है जो हम करेंगे - आप अपने प्राथमिक डेटाबेस से एक टेक्स्ट निर्यात (जैसे सीएसवी) उत्पन्न करते हैं और अपने सूचकांक को फ़ीड करते हैं। यह आपको वास्तविक तालिका संरचना (या बिल्कुल किसी भी SQL डेटाबेस) से पूरी तरह से स्वतंत्र होने की अनुमति देता है; वास्तव में हम कई तालिकाओं से डेटा एकत्रित निर्यात करते हैं। बाद में फ्लाई पर इंडेक्स को बढ़ाया जा सकता है।
उनके सर्वर के आधार पर (केवल 250kb या तो, एक कंसोल ऐप या विंडोज सेवा के रूप में चल रहा है) एक टीसीपी पोर्ट पर प्रश्नों के लिए सुनता है। प्रोटोकॉल पाठ आधारित है और थोड़ा "पुराना" दिखता है, लेकिन यह सरल और काम करता है। असल में आप केवल उन उपलब्ध इंडेक्स को पास करते हैं जिन्हें आप क्वेरी करना चाहते हैं और खोज शब्द (टुकड़े), स्थान सीमित है। तीन आउटपुट प्रारूप उपलब्ध हैं, एचटीएमएल/जावास्क्रिप्ट सरणी, एक्सएमएल या सीएसवी। वर्तमान में मैं कुछ हद तक "दिनांकित" वायर प्रोटोकॉल के लिए जावा रैपर पर काम कर रहा हूं। लेकिन परिणाम शानदार हैं: मेरे पास वर्तमान में 8 कॉलम अनुक्रमित के साथ लगभग 500,000 रिकॉर्ड्स का नमूना डेटा सेट है और मेरा परीक्षण एप्लिकेशन संपादित किए जाने के दौरान प्रत्येक कीस्ट्रोक पर JTextField की सामग्री के लिए सभी 8 कॉलम में एक खोज को ट्रिगर करता है और अपडेट कर सकता है रीयल-टाइम में परिणाम प्रदर्शित (जेटीबल)! यह MySQL इंस्टेंस पर जाने के बिना होता है, मूल रूप से डेटा आया था। कॉलम के आधार पर आप वापस आते हैं, फिर आप उस पंक्ति की प्राथमिक कुंजी के साथ MySQL से पूछकर "मूल" रिकॉर्ड मांग सकते हैं (निश्चित रूप से क्विकफ़िंड इंडेक्स में शामिल करने की आवश्यकता है)।
सूचकांक डेटा के पाठ निर्यात संस्करण का आकार लगभग 30-40% है। इंडेक्सिंग मुख्य रूप से डिस्क I/O गति से बंधी थी; मेरे 500,000 रिकॉर्ड संसाधित होने के लिए लगभग एक या दो मिनट लग गए।
इसका वर्णन करना मुश्किल है क्योंकि मुझे इन-हाउस उत्पाद डेमो देखने पर विश्वास करना मुश्किल था। उन्होंने 10 मिलियन पंक्ति पता डेटाबेस प्रस्तुत किए और नाम, पते और फोन नंबरों के टुकड़ों की खोज की और "खोज" बटन पर क्लिक करते समय, परिणाम एक सेकंड के नीचे वापस आये - सब कुछ एक नोटबुक पर किया गया! मुझे जो बताया गया है उससे वे अक्सर एसएपी या सीआरएम सिस्टम के साथ एकीकृत समय सुधारने के लिए एकीकृत होते हैं जब कॉल सेंटर एजेंट कॉलर के नाम या पते के टुकड़े को समझते हैं।
तो वैसे भी, शायद मैं इसका वर्णन करने में ज्यादा बेहतर नहीं होगा। अगर आपको ऐसा कुछ चाहिए तो आपको निश्चित रूप से यह जांचना चाहिए। Google Translate उनकी वेबसाइट को जर्मन से अंग्रेजी में अनुवाद करने का एक उचित काम है, इसलिए यह एक अच्छी शुरुआत हो सकती है।
पूर्ण सुझावों के बाद पैराग्राफ जोड़ा गया, पूर्ण टेक्स्ट खोज टूल का जिक्र करते हुए। उम्मीद है कि यह मेरी समस्या को स्पष्ट बनाता है। –
अधिक पृष्ठभूमि के साथ एक और अनुच्छेद जोड़ा गया –
लुसीन मैचों को प्रतिस्थापित करता है ... – Stobor