टेक्स्ट इंडेक्स
इस्तेमाल करने पर विचार करें एक $text
के साथ खोज
. यह नियमित अभिव्यक्तियों का उपयोग करने से कहीं बेहतर समाधान हो सकता है। हालांकि, टेक्स्ट सर्च स्कोरिंग-एल्गोरिदम के आधार पर दस्तावेज़ लौटाता है, इसलिए आपको कुछ ऐसे परिणाम मिल सकते हैं जिनमें वे सभी कीवर्ड नहीं हैं जिन्हें आप ढूंढ रहे हैं।
यदि आप इस फ़ील्ड में टेक्स्ट इंडेक्स नहीं जोड़ना चाहते हैं या नहीं करना चाहते हैं, तो एक रेगुलर एक्सप्रेशन का उपयोग करना काफी दर्द भरा होगा क्योंकि आप उस क्रम को नहीं जानते हैं जिसमें ये शब्द दिखाई देते हैं। मैं दावा नहीं करता कि लिखना असंभव है, लेकिन आप रेगेक्स मानकों के लिए भी एक भयानक घृणा के साथ समाप्त हो जाएंगे। $and
. का उपयोग करके कई बार रेगेक्स ऑपरेटर का उपयोग करना कहीं अधिक आसान होगा ऑपरेटर।
इसके अलावा, जब शब्द स्ट्रिंग के आरंभ या अंत में होता है या उसके बाद एक अवधि या अल्पविराम होता है, तो डिलीमीटर के रूप में एक स्थान का उपयोग विफल हो जाता है। शब्द-सीमा टोकन का उपयोग करें (\b
) इसके बजाय।
collection.find(
{ $and : [
{'documenttextfield': {'$regex': '\b' +keyword1+'\b'}},
{'documenttextfield': {'$regex': '\b' +keyword2+'\b'}},
{'documenttextfield': {'$regex': '\b' +keyword3+'\b'}},
]
});
ध्यान रखें कि यह वास्तव में धीमी क्वेरी है, क्योंकि यह संग्रह के प्रत्येक दस्तावेज़ पर इन तीन नियमित अभिव्यक्तियों को चलाएगी। जब यह एक प्रदर्शन-महत्वपूर्ण क्वेरी है, तो गंभीरता से विचार करें कि क्या कोई टेक्स्ट इंडेक्स वास्तव में ऐसा नहीं करेगा। इसे विफल करने पर, समझने के लिए आखिरी तिनका documenttextfield
. से किसी भी कीवर्ड को निकालना होगा वह फ़ील्ड जिसे कोई नया सरणी-फ़ील्ड documenttextfield_keywords
में खोज सकता है (जो इसमें प्रत्येक अद्वितीय शब्द हो सकता है) , उस फ़ील्ड पर एक सामान्य अनुक्रमणिका बनाएं, और उस फ़ील्ड पर से खोजें। $all
ऑपरेटर
(उस मामले में कोई रेगुलर एक्सप्रेशन की आवश्यकता नहीं है)।