2011-01-06 6 views
5

मुझे किसी SQLite डेटाबेस में किसी तालिका को क्वेरी करने की आवश्यकता है जो किसी पंक्ति में सभी पंक्तियों को वापस करने के लिए है जो शब्दों के दिए गए सेट से मेल खाते हैं।SQLite - पंक्तियों वाले टेक्स्ट को वापस कैसे करें जिसमें एक या अधिक तार हैं?

अधिक सटीक होने के लिए: मेरे पास ~ 80,000 रिकॉर्ड वाले डेटाबेस हैं। फ़ील्ड में से एक रिकॉर्ड फ़ील्ड है जिसमें प्रति रिकॉर्ड लगभग 100-200 शब्द हैं। मैं जो करने में सक्षम होना चाहता हूं वह 200 एकल शब्द कीवर्ड {"सेब", "नारंगी", "नाशपाती", ...} की सूची लेता है और तालिका में सभी रिकॉर्ड्स का एक सेट पुनर्प्राप्त करता है जिसमें कम से कम एक होता है वर्णन कॉलम में कीवर्ड शब्द का।

SELECT stuff FROM table 
WHERE (description LIKE '% apple %') or (description LIKE '% orange %') or ... 

अगर मैं 200 मामले है, मैं एक बड़ा और बुरा लग रही एसक्यूएल बयान है कि मुझे लगता है अनाड़ी होने के लिए के साथ खत्म, बू आती:

यह करने के लिए तुरंत स्पष्ट तरीका कुछ इस तरह से है बुरी आदत का, और आश्चर्यजनक रूप से प्रक्रिया करने में लंबा समय नहीं लगता - एक प्रति 1000 रिकॉर्ड से अधिक।

यह उत्तर Better performance for SQLite Select Statement मुझे जो चाहिए, उसके करीब लग रहा था, और नतीजतन मैंने एक इंडेक्स बनाया, लेकिन http://www.sqlite.org/optoverview.html एसक्लाइट के अनुसार किसी भी अनुकूलन का उपयोग नहीं करता है यदि LIKE ऑपरेटर को प्रारंभिक वाइल्डकार्ड के साथ उपयोग किया जाता है।

एक एसक्यूएल विशेषज्ञ नहीं है, मुझे लगता है कि मैं यह गूंगा तरीका कर रहा हूं। मैं सोच रहा था कि क्या अधिक अनुभव वाला कोई व्यक्ति ऐसा करने का अधिक समझदार और शायद अधिक कुशल तरीका सुझा सकता है?

वैकल्पिक रूप से, क्या समस्या का उपयोग करने के लिए एक बेहतर दृष्टिकोण है?

उत्तर

2

SQLite fulltext search का उपयोग करना LIKE '% ...%' क्वेरी से तेज़ होगा। मुझे नहीं लगता कि कोई डेटाबेस है जो% से शुरू होने वाली क्वेरी के लिए एक इंडेक्स का उपयोग कर सकता है, जैसे कि डेटाबेस नहीं जानता कि क्वेरी किस प्रकार से शुरू होती है, तो यह इसे देखने के लिए इंडेक्स का उपयोग नहीं कर सकती है।

एक वैकल्पिक दृष्टिकोण कीवर्ड को एक अलग तालिका में डाल रहा है, और एक मध्यवर्ती तालिका बना रहा है जिसमें आपकी मुख्य तालिका में कौन सी पंक्ति है, इस बारे में जानकारी है। यदि आपने इस तरह के सभी प्रासंगिक कॉलम को अनुक्रमित किया है, तो इसे बहुत जल्दी पूछताछ की जा सकती है।

+0

धन्यवाद, यह वास्तव में इस मुद्दे को संबोधित करता है। मैंने लिंक पर एक नज़र डाली और यह सही दिखता है। – Sam

0

यह पूर्ण-पाठ खोज के समान समस्या है, है ना? यदि आप इसे कुशलतापूर्वक करना चाहते हैं, तो इस मामले में, आपको इन क्षेत्रों में इंडेक्स बनाने के लिए डीबी से कुछ मदद की ज़रूरत है। SQLite पूर्ण पाठ खोज के लिए त्वरित खोज this page उत्पन्न करती है।

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

+0

उत्तर और अतिरिक्त जानकारी के लिए धन्यवाद। – Sam

0

लगता है जैसे आप Full Text Search पर एक नज़र रखना चाहते हैं। इसे Google से किसी के द्वारा SQLite में योगदान दिया गया था। विवरण:

की अनुमति देता है उपयोगकर्ता कुशलतापूर्वक डेटाबेस क्वेरी करने के लिए सभी पंक्तियां एक या अधिक शब्दों (इसके बाद "टोकन") होते हैं के लिए, भले ही तालिका कई बड़े दस्तावेज शामिल हैं।

संबंधित मुद्दे