क्या मैं पाठ में मिलान करने वाले शब्दों की खोज करते समय कोर डेटा क्वेरी अनुकूलित कर सकता हूं? (यह प्रश्न एक आईफोन पर कोर एसक्यूएल बनाम कोर डेटा के ज्ञान से संबंधित है।)पूर्ण पाठ खोज के लिए कोर डेटा क्वेरी को अनुकूलित करने के लिए कैसे करें
मैं एक नए (आईफोन) ऐप पर काम कर रहा हूं जो एक वैज्ञानिक डेटाबेस के लिए एक हैंडहेल्ड संदर्भ उपकरण है। मुख्य इंटरफ़ेस एक मानक खोज योग्य तालिका दृश्य है और मैं आपके द्वारा टाइप किए गए प्रतिक्रिया के रूप में उपयोगकर्ता को नए शब्द टाइप करना चाहता हूं। शब्द मिलान पाठ में शब्दों के उपसर्ग होना चाहिए। पाठ 100,000 शब्दों से बना है।
मेरे प्रोटोटाइप में मैंने सीधे एसक्यूएल कोड किया। मैंने मुख्य इकाई के टेक्स्ट फ़ील्ड में प्रत्येक शब्द युक्त एक अलग "शब्द" तालिका बनाई है। मैंने
SELECT id, * FROM textTable
JOIN (SELECT DISTINCT textTableId FROM words
WHERE word BETWEEN 'foo' AND 'fooz')
ON id=textTableId
LIMIT 50
की पंक्तियों के साथ शब्दों को सूचीबद्ध किया और प्रदर्शन किया। यह बहुत तेज़ चलता है। एक आईएन का उपयोग करना शायद ही काम करेगा, यानी
SELECT * FROM textTable
WHERE id IN (SELECT textTableId FROM words
WHERE word BETWEEN 'foo' AND 'fooz')
LIMIT 50
एलआईटी महत्वपूर्ण है और मुझे परिणाम तुरंत प्रदर्शित करने की अनुमति देता है। मैं उपयोगकर्ता को सूचित करता हूं कि सीमा तक पहुंचने पर प्रदर्शित करने के लिए बहुत सारे लोग हैं। यह kludgy है।
मैंने पिछले कई दिनों में कोर डेटा पर जाने के फायदों पर विचार किया है, लेकिन मुझे स्कीमा, इंडेक्सिंग और एक महत्वपूर्ण क्वेरी के लिए पूछताछ में नियंत्रण की कमी के बारे में चिंता है।
सैद्धांतिक रूप से textField MATCHES '.*\bfoo.*'
का एनएसपी्रेडिकेट काम करेगा, लेकिन मुझे यकीन है कि यह धीमा हो जाएगा। इस प्रकार की टेक्स्ट खोज इतनी आम है कि मुझे आश्चर्य है कि सामान्य हमला क्या है? क्या आप ऊपर की तरह एक शब्द इकाई बनायेंगे और "शब्द BEGINSWITH 'foo'" की भविष्यवाणी का उपयोग करेंगे? क्या यह मेरे प्रोटोटाइप के रूप में तेजी से काम करेगा? कोर डेटा स्वचालित रूप से सही इंडेक्स बना देगा? मुझे इंडेक्स के बारे में लगातार स्टोर की सलाह देने का कोई स्पष्ट माध्यम नहीं मिल रहा है।
मुझे अपने आईफोन ऐप में कोर डेटा के कुछ अच्छे फायदे दिखाई देते हैं। दोषपूर्ण और अन्य मेमोरी विचार मनमाने ढंग से सीमा निर्धारित किए बिना टेबलव्यू प्रश्नों के लिए कुशल डेटाबेस पुनर्प्राप्ति के लिए अनुमति देते हैं। ऑब्जेक्ट ग्राफ़ प्रबंधन मुझे आसानी से एसक्यूएल लिखने के बिना इकाइयों को आसानी से पार करने की अनुमति देता है। माइग्रेशन फीचर्स भविष्य में अच्छा होगा। दूसरी तरफ, सीमित संसाधन वातावरण (आईफोन) में मुझे चिंता है कि स्वचालित रूप से जेनरेट किया गया डेटाबेस मेटाडेटा, अनावश्यक व्यस्त रिश्तों, अक्षम गुण डेटाटाइप इत्यादि के साथ फूला जाएगा
क्या मुझे सावधानी बरतनी चाहिए या आगे बढ़ना चाहिए? ।
आपके उत्तर के लिए धन्यवाद। मैं सिर्फ एक xcdatamodel compliant डीबी में लोड प्रारंभिक sqlite डेटा प्राप्त करने के लिए कमांड लाइन उपकरण लिख रहा हूँ। पर्याप्त श्रम शामिल है। मैं अपने अनुभव पर वापस रिपोर्ट करूंगा। –
आपके उदाहरण पर अनुवर्ती करने के लिए, मुझे लगता है कि समस्या यह है कि एक fetch अनुरोध Word इकाई पर नहीं होगा, लेकिन टेक्स्टटेबल इकाई पर। (मान लें कि टेक्स्टटेबल में ईमेल संदेश हैं और वर्ड में सभी ईमेल फ़ील्ड्स में सभी शब्द शामिल हैं।) मुझे लगता है कि यह इस मामले को महत्वपूर्ण रूप से जटिल करता है क्योंकि fetchResultsController को टेक्स्ट रखने योग्य इकाइयां रखना चाहिए जो भविष्यवाणी के माध्यम से फ़िल्टर किए जाते हैं - और ऐसी कोई भी या सबक्विरी भविष्यवाणी है धीमी गति से। शायद "विपरीत" दिशा में ऐसा करने का एक तरीका है: डब्ल्यू/वर्ड मैचों को शुरू करके, व्यस्त रिश्ते के बाद, और पाठ को विशिष्ट बनाना। हममम। –
यदि आपकी भविष्यवाणी का पहला भाग जितना संभव हो सके खोज स्थान को कम कर देता है, तो शेष का अनुमान तेजी से प्रदर्शन करेगा, कुल मिलाकर, कम जगह के साथ इसे खोजना होगा। यहां कोर डेटा गाइड के प्रदर्शन अनुभाग पर एक नज़र डालें: http://developer.apple.com/mac/library/documentation/cocoa/conceptual/CoreData/Articles/cdPerformance.html#//apple_ref/doc/uid/ टीपी 40003468 –