2009-07-29 29 views
17

पर पैरामीटरयुक्त क्वेरी कैसे करूं मैं अपने लिए कुछ डेटा स्टोर करने के लिए कॉच डीबी का उपयोग करना चाहता हूं और फिर मुझे आवश्यक डेटा प्राप्त करने के लिए रीस्टफुल एपीआई कॉल का उपयोग करना चाहूंगा। मेरे डेटाबेस "परीक्षण" कहा जाता है और मेरे दस्तावेज़ सब एक समान संरचना है और कुछ इस तरह दिखाई (जहां hello_world दस्तावेज़ आईडी है):मैं CouchDB

"hello_world" : {"id":123, "tags":["hello", "world"], "text":"Hello World"} 
"foo_bar" :{"id":124, "tags":["foo", "bar"], "text":"Foo Bar"} 

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

http://localhost:5984/test/_design/search/_view/search_view?key= "हैलो"

लेकिन यह मुझे मेरे उपयोगकर्ताओं को अपनी क्वेरी स्ट्रिंग निर्दिष्ट करने की अनुमति नहीं देता है। उदाहरण के लिए, अगर उन्होंने "हैलो वर्ल्ड" की खोज की तो क्या होगा। मुझे दो प्रश्न पूछना होगा: एक "हैलो" और एक "दुनिया" के लिए, तो मुझे परिणामों को गठबंधन करने, डुप्लिकेट को हटाने, आदि (YUCK!) को जावास्क्रिप्ट का एक गुच्छा लिखना होगा।

http://localhost:5984/test/_design/search/_view/search_view?term= "हैलो दुनिया"

तब देखा गया मानचित्र में पैरामीटर "हैलो दुनिया" का उपयोग/सब को खोजने के लिए कार्यों को कम: क्या मैं वास्तव में चाहते हैं इस तरह कुछ करने के लिए सक्षम होने के लिए है दस्तावेज जिनमें टैग सरणी में "हैलो" और "दुनिया" दोनों शामिल हैं। क्या इस तरह की चीज कोचडबीबी के साथ भी संभव है? क्या इस विचार को पूरा करने का कोई और तरीका है कि मैं इस बारे में सोच नहीं रहा हूं?

उत्तर

19

CouchDB दृश्य फ़ेसटेड खोज या पूर्ण टेक्स्ट खोज या परिणाम चौराहे का समर्थन नहीं करते हैं। कॉचडब-ल्यूसीन प्लगइन आपको इन सभी चीजों को करने देता है। यदि आप प्रत्येक दस्तावेज़ के लिए कुंजी के रूप में दस्तावेज़ के टैग की Powerset के प्रत्येक सेट का उत्सर्जन

http://github.com/rnewson/couchdb-lucene/tree/master

+0

विस्तृत करने या उदाहरण प्रदान करने के लिए देखभाल? –

+6

वह परियोजना के डेवलपर्स में से एक है- "आप इसे नहीं कर सकते हैं, लेकिन यह परियोजना आपको देगी।" यह एक बहुत अच्छा जवाब है। – dnolen

2

तकनीकी तौर पर यह संभव है। कुंजी सेट तत्व का आदेश दिया जाना चाहिए और आपकी क्वेरी को आदेशित टैगों को भी पूछना होगा।

function map(doc) { 
    function powerset(array) { ... } 

    powerset_of_tags = powerset(doc.tags) 
    for(i in powerset_of_tags) { 
    emit(powerset_of_tags[i], doc); 
    } 
} 
इस फेंकना होगा डॉक {"hello_world" : {"id":123, "tags":["hello", "world"], "text":"Hello World"} के लिए

:

{ key: [], doc: ... } 
{ key: ['hello'], doc: ... } 
{ key: ['world'], doc: ... } 
{ key: ['hello', 'world'], doc: ... } 

हालांकि यह संभव है कि मैं इस एक नहीं बल्कि arkward समाधान पर विचार करेंगे। मैं बड़ी संख्या में टैग के लिए दृश्य के डिस्क उपयोग की कल्पना नहीं करना चाहता हूं। मुझे उम्मीद है कि उत्सर्जित कुंजियों की संख्या 2^एन की तरह बढ़ेगी।

+2

यह अनुशंसित नहीं है। प्रदर्शन बहुत पीड़ित होगा और जैसा कि आपने बताया है कि इंडेक्स के लिए भंडारण नियंत्रण से बाहर हो जाएगा। उपरोक्त वर्णित couchdb-lucene वह क्या करने के लिए सही तरीका है। –

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