इस लेख में हम नियमित अभिव्यक्तियों के बारे में बात करते हैं और आप Manticore Search में इसका उपयोग कैसे कर सकते हैं।
यदि हम पाठ मिलान के बारे में बात करें, तो सबसे सरल एक बस स्ट्रिंग तुलना है। खोज स्ट्रिंग और दस्तावेज़ या एक फ़ील्ड बिल्कुल समान होना चाहिए। अगली पाठ खोज विधि एक सरल पैटर्न मिलान करके होती है, जो खोज स्ट्रिंग को फ़ील्ड के उप-भाग के रूप में मिलाने की अनुमति देती है। यह सरल पैटर्न मिलान बुनियादी ऑपरेटरों जैसे वाइल्डकार्ड का उपयोग कर सकता है, जहाँ एक मेटा वर्ण जैसे *
या %
का मतलब है ‘कोई भी वर्ण मिलाना’। डेटाबेस में इसे आमतौर पर LIKE ऑपरेटर द्वारा पूरा किया जाता है, उदाहरण के लिए:
SELECT * FROM mytable WHERE title LIKE '%and%'
यह ‘and’ उपस्ट्रिंग वाले शिर्षकों के साथ पंक्तियों को मिलाएगा।
नियमित अभिव्यक्तियाँ साधारण पाठ पर काम करती हैं, LIKE की तरह, लेकिन इनमें जटिल मिलान पैटर्न बनाने की अनुमति देने के लिए शक्तिशाली सेट के मेटा वर्ण-ऑपरेटर होते हैं। एक regex पैटर्न वर्ण स्तर पर काम करता है और यह अक्षरों, संख्यात्मक अंकों और अन्य वर्णों को मिलाने में सक्षम होता है, या तो प्रतीकात्मक मान द्वारा (जैसे /abc/
abc
से मेल खाएगा) या वर्ग प्रकार द्वारा, उदाहरण के लिए \w
[A-Aa-z0-9_]
से मेल खाएगा। पैटर्न में बूलियन or
भी शामिल हो सकता है, जैसे abc|xyz
, मात्राएँ - ?
पूर्ववर्ती वर्णों की शून्य या एक घटनाओं को चिह्नित करता है या वाइल्डकार्ड (मेटाचारित्र .
)।
regexps के विपरीत, पूर्ण-पाठ खोज साधारण पाठ पर काम नहीं करती हैं, बल्कि वे पाठ को पर्स करती हैं और उन्हें शब्दों में विभाजित करती हैं। एक पूर्ण-पाठ खोज एक स्ट्रिंग पर पैटर्न खोजने की कोशिश नहीं करती है, बल्कि शब्दों के संग्रह में देखती है। जबकि नियमित अभिव्यक्तियाँ शब्दों को खोजने और अलग करने में सक्षम होती हैं, उनके पास स्वाभाविक सीमाएँ होती हैं क्योंकि वे बाइनरी खोजों जैसे abc -xyz
को सरलता से नहीं कर सकतीं या गणनात्मक कार्यक्षमता के साथ काम नहीं कर सकतीं। कुछ सुविधाएँ जो नियमित अभिव्यक्तियों में पाई जाती हैं, उन्हें पूर्ण-पाठ खोजों में भी पाया जा सकता है, जैसे शुरुआत/समापन ऑपरेटर। कुछ अलग तरीके से काम करते हैं। उदाहरण के लिए, regexps में वाइल्डकार्ड किसी भी संख्या के वर्णों के लिए जगह बना सकते हैं, लेकिन पूर्ण-पाठ खोजों के मामले में वाइल्डकार्ड केवल एक शब्द के दायरे के भीतर विस्तारित हो सकते हैं या वे एक शब्द के पूर्ण प्रतिस्थापनों के रूप में हो सकते हैं।
Manticore Search में regexp का उपयोग कैसे किया जाता है?
नियमित अभिव्यक्तियाँ अब तक सीमित समय के लिए
regexp_filter
द्वारा अनुक्रमण समय पर एक वैकल्पिक सुविधा के रूप में उपलब्ध थीं। Regexps का उपयोग उन स्ट्रिंग्स के रूपांतरण को निष्पादित करने के लिए किया जा सकता है जिनका अन्यथा नियमित टोकनकरण विकल्पों द्वारा कार्यान्वयन करना कठिन होता है। उदाहरण के लिए, ‘ae’ लिगेचर को ‘a’ से प्रतिस्थापित किया जा सकता है या आप पैटर्न जैसे XX"
को XX inch
में प्रतिस्थापित कर सकते हैं।
2.7.5 के बाद से SELECT क्वेरीज़ में नियमित अभिव्यक्तियों का उपयोग किया जा सकता है REGEX() फ़ंक्शन का उपयोग करके। REGEX() एक इनपुट के रूप में एक स्ट्रिंग स्वीकार करता है, जो एक स्ट्रिंग विशेषता या JSON स्ट्रिंग प्रॉपर्टी से आ सकती है और एक नियमित अभिव्यक्ति जिसे इनपुट के खिलाफ परीक्षण किया जाएगा। REGEX केवल विशेषता मानों के साथ काम करता है, इसे पूर्ण-पाठ क्षेत्रों के लिए इस्तेमाल नहीं किया जा सकता।
जब हम पहले से ही पूर्ण-पाठ क्षेत्रों में अनुक्रमित पाठ हो सकते हैं तो REGEX फ़ंक्शन की आवश्यकता क्यों है?
पहला, हमारे पास स्ट्रिंग हो सकती है (या तो विशेषताओं के रूप में या JSON डेटा में) जिन पर हमें एक खोज पैटर्न लागू करने की आवश्यकता होती है जो आवश्यक रूप से पूर्ण-पाठ मिलान से संबंधित नहीं होती। उदाहरण के लिए, मेटाडेटा में कुछ कोड हो सकते हैं और हम केवल उन रिकॉर्ड्स को संकीर्ण करना चाहते हैं जब ये कोड किसी अंक से शुरू होते हैं जैसे
SELECT * FROM myindex WHERE MATCH('something') AND REGEX(json_attr.code, "^\d\w+")
एक और कारण यह है कि वर्तमान में JSON विशेषताओं से पाठ डेटा पूर्ण-पाठ के रूप में अनुक्रमित नहीं किया जाता है। यदि हमें कुछ स्ट्रिंग प्रॉपर्टीज पर तुलना मिलान से अधिक कार्य करने की आवश्यकता होती है, तो हमें उन्हें एक पूर्ण-पाठ क्षेत्र में लाने की आवश्यकता होगी (और विशेष लेबलों पर मिलान को सीमित करने के लिए ZONEs का उपयोग करना होगा) या कई पूर्ण-पाठ क्षेत्रों में (जो समस्या हो सकती है यदि ये प्रॉपर्टीज़ संख्या में भिन्न हो सकती हैं)।
उदाहरण के लिए, एक JSON ऑब्जेक्ट में संकुचित उत्पाद का मेटाडेटा एक संपत्ति का विवरण कर सकता है जिसमें उस उत्पाद के संगत उपकरणों की सूची होती है। REGEX के साथ हम एक पैटर्न बना सकते हैं जो उस उत्पाद का मिलान कर सकता है जिसे हम चाहते हैं या यहां तक कि उस उत्पाद की एक श्रृंखला:
SELECT * FROM myindex WHERE MATCH('red case') AND REGEX(json_attr.compatible_devices, "Galaxy S[7|8|9]")
कुछ मामलों में REGEX() अनिवार्य हो सकता है। हमें बताएं यदि आप इसे उपयोगी पाते हैं!