2013-06-03 5 views
31

मेरे पास एक सरणी "चाबियाँ" पर एक अनुक्रमणिका है जिसका उपयोग मैं अपने आवेदकॉन को पूर्ण पाठ कार्यक्षमता प्रदान करने के लिए कर रहा हूं।मोंगोडीबी टेक्स्ट सर्च और कई खोज शब्द

2.4.3 के रिलीज के साथ, मैं "टेक्स्ट" इंडेक्स प्रकार का उपयोग करना चाहता हूं। मैंने अपनी सरणी "चाबियाँ" पर एक "टेक्स्ट" इंडेक्स प्रकार बीमा किया और ऐसा लगता है कि सुपर फास्ट (मेरे पुराने कीवर्ड पूर्ण टेक्स्ट विधि से तेज़) काम करता है।

समस्या यह है कि, मेरा ऐप मानता है कि फ़ील्ड समावेशी (AND) हैं। डिफ़ॉल्ट रूप से, पाठ खोज मेरे पैरामीटर ORs।

क्या कोई भी टेक्स्ट खोज को विशेष रूप से चलाने का तरीका जानता है?

उदाहरण के लिए:

db.supplies.runCommand("text", {search:"printer ink"}) 

या तो प्रिंटर या स्याही से सभी परिणाम के बजाय दोनों प्रिंटर और स्याही के साथ परिणाम वापस चाहिए।

+5

मैं वास्तव में ऐसे समाधान की सराहना करता हूं जो शब्द को मारने से नहीं मारता है। – Mitja

+2

क्या आपको शब्द स्टेमिंग के साथ समाधान मिल सकता है? – Zhomart

उत्तर

49

को आजमाएँ:

db.supplies.runCommand("text", {search:"\"printer\" \"ink\""}) 

इसके अलावा, यहां docs से एक उद्धरण है:

खोज स्ट्रिंग वाक्यांश शामिल हैं, खोज खोज में एक और साथ किसी अन्य शब्द के प्रदर्शन करती है स्ट्रिंग; जैसे "\" ट्विंकल "ट्विंकल ट्विंकल" और "" थोड़ा "या " स्टार "के लिए चमकते \" छोटे सितारा "की खोज करें)।

आशा है कि मदद करता है।

+2

आप। चट्टान। महोदय। धन्यवाद। – kmehta

+8

ध्यान दें कि यह टेक्स्ट इंडेक्स की कूल फीचर्स फेंकता है जैसे कि कचरे में जो शब्द कचरा होता है। यदि मेरा टेक्स्ट है, तो यहां कुछ शांत परीक्षण प्रविष्टियां हैं , मुझे इसे '{$ खोज:" प्रविष्टि "}' के साथ मिल जाएगी, लेकिन '{$ खोज:" \ "प्रविष्टि \" "}' के साथ नहीं। – Mitja

+0

@ मिट्जा शब्द स्टेमिंग खोने के बिना ऐसा करने का कोई तरीका? – Rohmer

2

आप डबल उद्धरण में प्रत्येक शब्द लपेट कर सकते हैं:

let keywords = ctx.params.query.split(/\s+/).map(kw => `"${kw}"`).join(' '); 
match.$text = { $search: keywords, $caseSensitive: false }; 

वहाँ एक नकारात्मक पक्ष यह है उपयोगकर्ता एक उद्धृत स्ट्रिंग इस काम नहीं करेगा आदानों है। आपको सबसे पहले उद्धृत तारों को पार्स करना होगा।

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