2012-04-30 18 views
5

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

मैं रीयलटाइम (कुछ मिलीसेकंड) में अनुरोध करने में सक्षम होना चाहता हूं, शीर्ष एन आइटम दिए गए ~ गुणों का कोई संयोजन।

आप किस समाधान की सिफारिश करेंगे? मैं कुछ बेहद स्केलेबल की तलाश में हूं।

-
- वर्तमान में हम MongoDB और सरणी सूचकांक पर देख रहे हैं, आप किसी भी सीमा देखते हैं?
- सोलर एक संभावित समाधान है लेकिन हमें टेक्स्ट खोज क्षमताओं की आवश्यकता नहीं है।

+1

जब आप "स्कोर द्वारा क्रमबद्ध" कहते हैं तो क्या आपका मतलब है कि यह पहले से ही प्रीकंप्यूटेड है? यदि ऐसा है तो एसओएलआर कोई लाभ नहीं दे सकता है। यदि नहीं, तो एसओएलआर बहुत शक्तिशाली और अनुकूलन प्रासंगिकता रैंकिंग प्रदान करता है। – nickdos

+0

लाखों आइटम एसओएलआर के लिए कोई समस्या नहीं है लेकिन 10,000 संभावित विशेषताओं _could_ एक समस्या है। एसओएलआर गतिशील क्षेत्रों का समर्थन करता है, इसलिए आपको सभी विशेषताओं को परिभाषित करने की आवश्यकता नहीं है लेकिन स्मृति व्यापक/स्पैस स्कीमा के साथ उड़ सकती है? अन्य इस पर सलाह देने में सक्षम हो सकते हैं। – nickdos

+0

@nickdos हाँ स्कोर precomputed है। और मुझे लगता है कि आप सही हैं कि मुश्किल हिस्सा गुणों की बड़ी संख्या है। मुझे नहीं पता कि कैसे mongodb इसे संभालते हैं। क्या यह प्रति गुण एक सूचकांक बनाता है? क्या यह सूचकांक भी संभव है? हम वैसे भी परीक्षण करने जा रहे हैं लेकिन मैं यह सुनिश्चित करना चाहता हूं कि हम सही रणनीति को याद न करें। – log0

उत्तर

9

MongoDB आप क्या चाहते हैं, अगर आप इस

{ score:2131, attributes: ["attr1", "attr2", "attr3"], ... } 

की तरह अपने वस्तुओं संग्रहीत तो निम्न क्वेरी सभी आइटम att1 और ATTR2

c = db.mycol.find({ attributes: { $all: [ "attr1", "attr2" ] } }) 

लेकिन इस जीत लिया है कि मिलान कर देंगे 'संभाल कर सकते हैं टी

c = db.mycol.find({ attributes: { $all: [ "attr1", "attr4" ] } }) 

क्वेरी कर्सर लौटाती है, अगर आप इस कर्सर को सॉर्ट करना चाहते हैं, टी मुर्गी की तरह ही तो

c = db.mycol.find({ attributes: { $all: [ "attr1", "attr2" ] }}).sort({score:1}) 

Advanced Queries पर एक नज़र क्या संभव है देखने के लिए है प्रश्न के प्रकार पैरामीटर जोड़ दें।

उपयुक्त अनुक्रमणिका सेटअप के रूप में

db.mycol.ensureIndex({attributes:1, score:1}) 

इस प्रकार है और आप का उपयोग कर

db.mycol.find({ attributes: { $all: [ "attr1" ] }}).explain() 

मोंगो बताते हैं कि कैसे कई वस्तुओं स्कैन किया गया, कितनी देर तक आपरेशन और विभिन्न अन्य आंकड़े ले लिया प्रदर्शन जानकारी प्राप्त कर सकते हो सकता है ।

+0

वास्तव में मोंगोडब बहुत अच्छी तरह से फिट लगता है, लेकिन मुझे दक्षता के बारे में चिंता है। आपने यहां इंडेक्स का उल्लेख नहीं किया है। मेरे मामले में पर्याप्त गुण और स्कोर पर एक सूचकांक है ... – log0

+0

मैंने इंडेक्स के बारे में जानकारी जोड़ दी है। सुनिश्चित करें कि आपकी सभी अनुक्रमणिका मेमोरी में फिट हों, अन्यथा आपके प्रश्न धीमे हो जाएंगे। –

+0

मैंने कहीं पढ़ा है कि संग्रह पर अधिकतम 64 इंडेक्स हो सकते हैं। अनुक्रमित सरणी के मामले में क्या होता है? क्या इसका मतलब यह है कि मोंगो 10 000 इंडेक्स बनाएगा? – log0

2

यह वही है जो मोंगो से निपट सकता है। तथ्य यह है कि आपके गुण बुलियन प्रकार हैं यहां मदद करता है। एक संभावित स्कीमा नीचे सूचीबद्ध है:

[ 
    { 
     true_tags:[attr1, attr2, attr3, ...], 
     false_tags: [attr4, attr5, attr6, ...] 
    }, 
] 

फिर हम true_tags और false_tags पर सूचकांक कर सकते हैं। और यह $, $ सभी, ... क्वेरी ऑपरेटरों के साथ खोज करने के लिए कुशल होना चाहिए।

+0

क्षमा करें यह बहुत स्पष्ट नहीं था लेकिन बुलियन द्वारा मेरा मतलब था कि आइटम में विशेषता है या तो नहीं। आपका उत्तर अभी भी खड़ा है, लेकिन मैं अधिक सटीक जानकारी की तलाश में हूं। क्या इस तरह के सूचकांक पर सीमा है (ऐसा लगता है कि मुख्य आकार, सूचकांक की अधिकतम संख्या आदि .. लेकिन शायद मेरी जानकारी पुरानी है)? यह sharding के साथ कैसे काम करता है? – log0

2

Redis "आइटम के लाखों स्कोर द्वारा आदेश दिया" के लिए

  • "शीर्ष n आइटम" के लिए एक आदर्श उम्मीदवार होगा

Redis एक डेटा संरचना में बनाया गया है कि आप कर सकते हैं से शुरू करें: Sorted Set => सॉर्ट किए गए सेट के प्रत्येक सदस्य स्कोर से जुड़े होते हैं। जो उदाहरण के लिए ZRANGEBYSCORE साथ स्कोर की श्रेणी में रखा जा सकता है:

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] 

मैं आपकी समस्या के रूप में हल सेट commands को देखने के लिए और Redis का एहसास दिलाने में, (के रूप में यह कहा गया है) उसके द्वारा मांगी जाने प्रोत्साहित करते हैं। आप निश्चित रूप से एक ही सेट तत्व के रूप में कई विशेषताओं को रखना चाह सकते हैं।


जहाँ तक MongoDB के रूप में, जब से तुम लाखों उल्लेख किया है, जब तक कि आप अपनी समस्या के लिए काम करने के लिए वृद्धिशील प्रश्नों आमादा कर सकते हैं, मैं एक उप दूसरी प्रतिक्रिया की उम्मीद नहीं होगा।

जैसा कि @ निकोडोस का उल्लेख किया गया है, सौर प्रासंगिकता एक बहुत ही शक्तिशाली विशेषता है, लेकिन गुणों की संख्या एक समस्या होगी, क्योंकि प्रत्येक आइटम के लिए यह सभी विशेषताओं को स्मृति में रखना होगा। हालांकि प्रत्येक के लिए एक दर्जन खराब नहीं हो सकता है => बस कोशिश करें और देखें।