फ़िल्टर निष्कर्षण: रेगेक्स शब्द सीमा मिलान
यह लेख बताता है कि हम शब्द सीमा रेगेक्स मिलान का उपयोग करके वाक्यांश-से-फ़िल्टर मैपिंग के खिलाफ प्राकृतिक भाषा खोज प्रश्नों से संरचित उत्पाद फ़िल्टर कैसे निकालते हैं।
समस्या: प्राकृतिक भाषा से संरचित फ़िल्टर तक
जब कोई उपयोगकर्ता "16gb ram वाला mini pc" खोजता है, तो हमें निकालने की आवश्यकता है:
{
"Form Factor": "Mini PC",
"Main Memory": "16"
}
ये संरचित फ़िल्टर सक्षम करते हैं:
-
उत्पाद फ़िल्टरिंग: केवल मिलान वाले उत्पाद दिखाएं
-
फ़ेसिटेड नेविगेशन: उपलब्ध फ़िल्टर विकल्प प्रदर्शित करें
-
क्वेरी पेज जनरेशन: SEO-अनुकूलित पेज बनाएं
-
संबंधित खोजें: समान प्रश्न खोजें
चुनौती यह है कि उपयोगकर्ता एक ही इरादे को व्यक्त करने के सभी तरीकों को संभाला जाए।
एल्गोरिदम: शब्द सीमा रेगेक्स मिलान
चरण 1: वाक्यांश मैपिंग लोड करें
हम SEO पाइपलाइन द्वारा जेनरेट किए गए वाक्यांश-से-फ़िल्टर मैपिंग लोड करते हैं। ये मैपिंग वाक्यांशों को फ़िल्टर मानों से जोड़ती हैं, जिससे वाक्यांश से संबंधित फ़िल्टर कुंजी और मान देखने की अनुमति मिलती है।
हम तेज़ लुकअप के लिए इस संरचना को उलट देते हैं, ताकि हम फ़िल्टर के बजाय वाक्यांश द्वारा खोज सकें:
phrase_to_filter = {
"16gb ram": ("Main Memory", "16"),
"16 gb ram": ("Main Memory", "16"),
"mini pc": ("Form Factor", "Mini PC"),
"mini computer": ("Form Factor", "Mini PC")
}
चरण 2: क्वेरी को सामान्य करें
केस-इनसेंसिटिव मिलान के लिए क्वेरी को लोअरकेस में बदलें।
चरण 3: शब्द सीमाओं के साथ वाक्यांश मिलाएं
मैपिंग में प्रत्येक वाक्यांश के लिए, हम जांचते हैं कि क्या यह क्वेरी में रेगुलर एक्सप्रेशन में शब्द सीमा एंकर का उपयोग करके प्रकट होता है।
\b एंकर यह सुनिश्चित करते हैं कि हम पूर्ण शब्दों से मिलान करें, उपस्ट्रिंग्स से नहीं: "mini pc" का मिलान "mini pc with ram" से होता है लेकिन "minipc" (बिना स्पेस) से नहीं, और "16gb" का मिलान "16gb ram" से होता है लेकिन "216gb" (आंशिक मिलान) से नहीं।
चरण 4: सभी मिलान एकत्र करें
हम सभी वाक्यांशों के माध्यम से पुनरावृति करते हैं और मिलान वाले फ़िल्टर एकत्र करते हैं। "mini pc with 16gb ram" के लिए, यह {"Form Factor": "Mini PC", "Main Memory": "16"} जैसे फ़िल्टर उत्पन्न करता है।
शब्द सीमाएँ क्यों?
शब्द सीमाएँ गलत मिलान को रोकती हैं:
बिना शब्द सीमाओं के:
-
"i5" का मिलान "i5000" से होगा (गलत)
-
"ram" का मिलान "program" से होगा (गलत)
-
"pc" का मिलान "pcie" से होगा (गलत)
शब्द सीमाओं के साथ: "i5" का मिलान "i5 processor" से होता है ✅ लेकिन "i5000" से नहीं ❌; "ram" का मिलान "16gb ram" से होता है ✅ लेकिन "program" से नहीं ❌। \b एंकर यह सुनिश्चित करता है कि हम केवल शब्द किनारों पर मिलान करें।
एकाधिक मिलान को संभालना
यदि एक ही फ़िल्टर के लिए कई वाक्यांश मिलते हैं, तो अंतिम मिलान जीतता है:
# Query: "mini pc small computer"
# Both "mini pc" and "small computer" map to "Form Factor:Mini PC"
# Result: {"Form Factor": "Mini PC"} (deduplicated)
यदि एक ही फ़िल्टर के लिए अलग-अलग मानों वाले कई वाक्यांश मिलते हैं, तो अंतिम मिलान जीतता है:
# Query: "8gb 16gb ram"
# "8gb" → Main Memory:8
# "16gb" → Main Memory:16
# Result: {"Main Memory": "16"} (last match wins)
व्यवहार में, उपयोगकर्ता शायद ही कभी विरोधाभासी मान निर्दिष्ट करते हैं, इसलिए यह कोई समस्या नहीं है।
वाक्यांश प्राथमिकता
वाक्यांशों का मिलान मैपिंग में उनके प्रकट होने के क्रम में किया जाता है। चूंकि मैपिंग समानता (उच्चतम पहले) और फिर लंबाई (सबसे छोटा पहले) के आधार पर क्रमबद्ध होती हैं, इसलिए उच्च-गुणवत्ता वाले मिलान पहले जांचे जाते हैं। हालाँकि, चूंकि हम सभी वाक्यांशों के माध्यम से पुनरावृति करते हैं, क्रम अंतिम परिणाम को प्रभावित नहीं करता है—अंतिम मिलान जीतता है।
प्रदर्शन अनुकूलन
कैशिंग
वाक्यांश-से-फ़िल्टर मैपिंग स्टार्टअप पर एक बार लोड की जाती है और मेमोरी में कैश की जाती है, जिससे हर अनुरोध पर दोहराई जाने वाली डिस्क I/O से बचा जाता है।
वाल्की फॉलबैक
हम पहले वाल्की (रेडिस फोर्क) से मैपिंग लोड करने का प्रयास करते हैं, और JSON फ़ाइलों पर वापस आते हैं:
- तेज़ इन-मेमोरी लुकअप के लिए वाल्की जांचें
- वाल्की मिस होने पर JSON से लोड करें
- कैश एक्सपायरेशन के साथ वाल्की में स्टोर करें
इससे बाद के अनुरोधों के लिए विलंबता कम हो जाती है।
रेगेक्स मिलान
पैटर्न re.search() का उपयोग शब्द सीमा एंकर के साथ करते हैं ताकि गलत आंशिक मिलान के बिना पूर्ण शब्दों का कुशलता से मिलान किया जा सके।
खोज सेवा के साथ एकीकरण
फ़िल्टर निष्कर्षण एक API सेवा एंडपॉइंट के रूप में लागू किया गया है जो खोज प्रश्नों को स्वीकार करता है और निकाले गए फ़िल्टर लौटाता है।
सेवा:
- इनपुट के रूप में एक खोज क्वेरी स्वीकार करती है
- वाक्यांश-से-फ़िल्टर मैपिंग को मेमोरी में लोड करती है
- शब्द सीमाओं के साथ वाक्यांशों को सामान्य करती है और मिलान करती है
- संरचित फ़िल्टर कुंजी-मान जोड़े लौटाती है
मुख्य वेब सर्वर उपयोगकर्ता प्रश्नों से फ़िल्टर निकालने के लिए इस सेवा को कॉल करता है:
filters = extract_filters_from_query("mini pc 16gb ram")
# Returns: {"Form Factor": "Mini PC", "Main Memory": "16"}
चिंताओं का यह पृथक्करण अनुमति देता है:
-
स्वतंत्र स्केलिंग: फ़िल्टर निष्कर्षण एक अलग सर्वर पर चल सकता है
-
कैशिंग आइसोलेशन: सेवा अपने स्वयं के मैपिंग कैश का प्रबंधन करती है
-
सेवा रीस्टार्ट: सेवा को मुख्य वेब सर्वर को प्रभावित किए बिना स्वतंत्र रूप से रीस्टार्ट किया जा सकता है
विवरण के लिए खोज सेवा वास्तुकला देखें।
क्वेरी लॉगिंग
प्रत्येक फ़िल्टर निष्कर्षण को SEO पाइपलाइन खपत के लिए लॉग किया जाता है। ये लॉग समय के साथ नए क्वेरी पैटर्न खोजने और वाक्यांश मैपिंग में सुधार करने के लिए SEO पाइपलाइन में वापस फीड करते हैं।
उपयोग के मामले
क्वेरी पेज (/q/)
क्वेरी पेज यह निर्धारित करने के लिए URL स्लग से फ़िल्टर निकालते हैं कि कौन से उत्पाद प्रदर्शित करने हैं।
खोज API (/api/search)
खोज API खोज क्वेरी से फ़िल्टर निकालती है ताकि मिलान वाले उत्पाद ढूंढे और लौटाए जा सकें।
ऑटोकम्पलीट
ऑटोकम्पलीट सुझाव खोज सुझावों के साथ फ़िल्टर पूर्वावलोकन प्रदान करने के लिए फ़िल्टर निकालते हैं।
संबंधित खोजें
संबंधित खोज जनरेशन समान प्रश्न खोजने के लिए निकाले गए फ़िल्टर का उपयोग करता है:
Query: "mini pc 16gb ram"
→ Filters: {"Form Factor": "Mini PC", "Main Memory": "16"}
→ Find queries with similar filters
→ Suggest: "mini pc 32gb ram", "mini pc 16gb ssd"
विवरण के लिए संबंधित खोज जनरेशन देखें।
त्रुटि प्रबंधन
गुम मैपिंग
यदि वाक्यांश मैपिंग लोड नहीं हुई हैं, तो हम खाली फ़िल्टर लौटाते हैं। यह तब क्रैश को रोकता है जब SEO पाइपलाइन अभी तक नहीं चली है।
अमान्य प्रश्न
खाली या केवल व्हाइटस्पेस वाले प्रश्न खाली फ़िल्टर लौटाते हैं।
रेगेक्स त्रुटियाँ
हम रेगेक्स मिलान से पहले वाक्यांशों को सैनिटाइज़ करने के लिए रेगेक्स एस्केपिंग का उपयोग करते हैं, जिससे वाक्यांशों में विशेष वर्णों से सिंटैक्स त्रुटियों को रोका जाता है।
प्रदर्शन विशेषताएँ
फ़िल्टर निष्कर्षण शब्द सीमा रेगेक्स मिलान और आक्रामक कैशिंग के कारण कुशलता से संचालित होता है:
-
मैपिंग लोड स्टार्टअप पर एक बार होता है
-
प्रति-क्वेरी निष्कर्षण CPU-बाउंड है (रेगेक्स मिलान)
-
कैश के लिए मेमोरी उपयोग प्रबंधनीय बना रहता है
-
प्रोडक्शन में कैश हिट दरें उच्च हैं
शब्द सीमा रेगेक्स सबस्ट्रिंग खोज से तेज़ है क्योंकि रेगेक्स इंजन गैर-मिलान वाली स्थितियों को कुशलता से छोड़ सकता है।
सीमाएँ
वाक्यांश क्रम निर्भरता
हम वाक्यांशों का मिलान पुनरावृति क्रम में करते हैं, जो गारंटीकृत नहीं है। यदि दो वाक्यांश ओवरलैप करते हैं, तो अंतिम मिलान जीतता है:
# Query: "mini pc"
# Phrases: ["mini", "mini pc"]
# If "mini" is checked last, it overwrites "mini pc"
व्यवहार में, ऐसा नहीं होता क्योंकि:
-
लंबे वाक्यांश अधिक विशिष्ट होते हैं और क्रमबद्ध मैपिंग में पहले आते हैं
-
ओवरलैपिंग वाक्यांश आमतौर पर एक ही फ़िल्टर मान पर मैप होते हैं
कोई वाक्यांश संयोजन नहीं
हम कई वाक्यांशों को एक ही फ़िल्टर मान में संयोजित नहीं करते:
```python