इस लेख में हम चर्चा करते हैं कि एकल CALL QSUGGEST का उपयोग कैसे विशेष मामलों में वाक्यांशों को ठीक करने के लिए किया जा सकता है।
CALL QSUGGEST को Sphinx 2.x के अंतिम संस्करण में प्रस्तुत किया गया था। यह कथन इनफिक्सिंग सक्षम होने पर एक इनपुट शब्द के शब्दकोष से निकटतम मेल खोजने की अनुमति देता है। इस सुविधा का सबसे सामान्य उपयोग मामला “क्या आप इसका मतलब …?” कार्यक्षमता को लागू करना है।
QSUGGEST के परिचय से पहले, “क्या आप इसका मतलब …?” प्राप्त करने के लिए, शब्दों को संकेत शब्दकोश से निकालना और शब्दों के ट्रिग्राम को एक अलग संकेत में रखना आवश्यक था। इनपुट शब्द के ट्रिग्राम के आधार पर एक खोज फिर इस संकेत के खिलाफ की जाती। इसके बाद, लौटाए गए मेलों की गुणवत्ता में सुधार करने के लिए,
Levenshtein दूरी
की गणना की गई थी।
CALL QSUGGEST इस आवश्यकता को समाप्त करता है, क्योंकि यह एक अलग संकेत की आवश्यकता नहीं है और यह Levenshtein गणना भी प्रदान करता है, न केवल एक और संकेत की आवश्यकता को हटाना (जिसे समय-समय पर ताज़ा करने की आवश्यकता होगी), बल्कि इस सुविधा को लागू करने के लिए अतिरिक्त कोड को भी हटाना है।
हालाँकि CALL QSUGGEST इनपुट पर एक से अधिक शब्द प्राप्त करने की अनुमति देता है, यह केवल अंतिम शब्द पर सुझाव देने के लिए देखेगा और बाकी को नज़रअंदाज़ करेगा। इसका विपरीत - CALL SUGGEST - पहले शब्द का उपयोग करता है और बाकी को नज़रअंदाज़ करता है। यदि हम कई शब्दों पर सुझाव देना चाहते हैं, तो पहला विकल्प है कई QSUGGEST कॉल करना। लेकिन, ऐसे मामले हो सकते हैं जहां हमारा इनपुट एक विशिष्ट शब्द या वर्गीकरण (उदाहरण के लिए, उत्पाद SKU या टैग) है जो एक से अधिक शब्दों या एक शब्द को अलग-अलग शब्दों में तोड़ने (उपयोगकर्ता की गलती से) से बना है। इन मामलों में एकल SQUGGEST का उपयोग किया जा सकता है।
जैसा कि हमने ऊपर कहा, CALL QSUGGEST ट्रिग्राम पर आधारित है। यदि हम एक से अधिक शब्दों से बने शब्दों का मेल करने का प्रयास कर रहे हैं तो हम मौजूदा व्हाइटस्पेस को इंडेक्सेबल वर्णों के रूप में रख सकते हैं, जिससे हमें एकल “शब्द” मिलेगा जिस पर QSUGGEST काम कर सकता है। उदाहरण के लिए, हम व्हाइटस्पेस को अंडरस्कोर से बदल सकते हैं जो कि डिफ़ॉल्ट charset_table में शामिल है। इसे काम करने के लिए, हमें संकेत में इन शब्दों के एक अतिरिक्त संस्करण को जोड़ने की आवश्यकता होगी जहाँ व्हाइटस्पेस (या अन्य गैर-इंडेक्सेबल वर्ण) को एक इंडेक्सेबल वर्ण से बदल दिया जाएगा। एक विकल्प बस व्हाइटस्पेस को हटा देना होगा, लेकिन हम अलग-अलग शब्दों के लिए समान टोकन के साथ समाप्त हो सकते हैं।
इस त्वरित उदाहरण में हम विकिपीडिया के लेखों के एक डंप का उपयोग कर रहे हैं जहाँ हमने अंडरस्कोर के साथ व्हाइटस्पेस को बदलकर लेखों के शीर्षकों का एक अलग संस्करण इंडेक्स किया है।
पहले उदाहरण में, हम Manticore Search के एक प्रमुख समर्थक - Craigslist के नाम को गलत लिखने जा रहे हैं। गलत शब्दों को उन वास्तविक खोजों से लिया गया है जो हमारी वेबसाइट पर आईं:
mysql> CALL QSUGGEST('craig_list','wikititles', 1 as non_char);
+--------------+----------+------+
| suggest | distance | docs |
+--------------+----------+------+
| craigslist | 1 | 1 |
| craig_first | 2 | 1 |
| craig_zisk | 2 | 1 |
| craig_ellis | 3 | 1 |
| craig_ellis_ | 3 | 1 |
+--------------+----------+------+
5 rows in set (0.09 sec)
mysql> CALL QSUGGEST('crages_list','wikititles', 1 as non_char);
+--------------+----------+------+
| suggest | distance | docs |
+--------------+----------+------+
| craigslist | 3 | 1 |
| swadesh_list | 4 | 2 |
| danger_list | 4 | 1 |
| dean_s_list | 4 | 1 |
| lrus_list | 4 | 1 |
+--------------+----------+------+
5 rows in set (0.13 sec)
mysql> CALL QSUGGEST('crag_list','wikititles', 1 as non_char);
+------------+----------+------+
| suggest | distance | docs |
+------------+----------+------+
| craigslist | 2 | 1 |
| craig_zisk | 3 | 1 |
| brad_listi | 3 | 1 |
| army_list | 3 | 1 |
| cratylism | 3 | 1 |
+------------+----------+------+
5 rows in set (0.03 sec)
एक उल्टा मामला तब होता है जब उपयोगकर्ता शब्दों के बीच स्पेस टाइप नहीं करता है, जिसके परिणामस्वरूप एक शब्द के बजाय एक ही शब्द होता है।
mysql> CALL QSUGGEST('starwars','wikititles', 1 as non_char);
+------------+----------+------+
| suggest | distance | docs |
+------------+----------+------+
| star_wars | 1 | 108 |
| starways | 1 | 1 |
| star_wars_ | 2 | 8 |
| stakkars | 2 | 1 |
| stalwart | 2 | 1 |
+------------+----------+------+
5 rows in set (0.01 sec)
हम दोनों शब्दों को गलत भी कर सकते हैं:
mysql> CALL QSUGGEST('abaham_lincol','wikititles', 1 as non_char);
+-----------------+----------+------+
| suggest | distance | docs |
+-----------------+----------+------+
| abraham_lincoln | 2 | 1 |
| abraham_sinkov | 4 | 1 |
+-----------------+----------+------+
2 rows in set (0.14 sec)
क्योंकि QSUGGEST Levenshtein की दूरी को लागू करता है, शब्दों का क्रम महत्वपूर्ण है और उल्टे क्रम में शब्दों की जांच करने से अपेक्षित परिणाम नहीं मिलेंगे, उदाहरण के लिए:
mysql> CALL QSUGGEST('lincol_abaham','wikititles', 1 as non_char);
+---------------+----------+------+
| suggest | distance | docs |
+---------------+----------+------+
| lincoln_isham | 4 | 1 |
+---------------+----------+------+
1 row in set (0.14 sec)
इस मामले के लिए, प्रत्येक शब्द के लिए एक QSUGGEST कॉल का उपयोग किया जाना चाहिए या यदि शब्दों को संकेत से अलग किया जा सकता है, तो एक ट्रिग्राम खोज का उपयोग किया जाना चाहिए।