Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

MySQL में पूर्ण-पाठ खोज:द गुड, द बैड एंड द अग्ली

कभी-कभी MySQL डेटाबेस में खोज करते समय आप वर्ण-आधारित डेटा के विरुद्ध पूर्ण-पाठ खोज क्वेरी चलाना चाह सकते हैं। आज हम ऐसी खोज विधियों के फायदे और नुकसान के बारे में चर्चा कर रहे हैं।

MySQL में पूर्ण-पाठ खोज क्या हैं?

पूर्ण-पाठ खोज एक ऐसी तकनीक है जो आपको ऐसे रिकॉर्ड की खोज करने में सक्षम बनाती है जो शायद खोज मानदंड से पूरी तरह मेल नहीं खाते। MySQL में पूर्ण-पाठ खोज तब की जाती है जब कुछ इंडेक्स उपयोग में होते हैं और उन इंडेक्स में निम्नलिखित सहित कई अनूठी बारीकियां होती हैं:

  • सूचकांक को पूर्ण-पाठ अनुक्रमणिका माने जाने के लिए, अनुक्रमणिका FULLTEXT प्रकार की होनी चाहिए।
  • FULLTEXT अनुक्रमणिका का उपयोग केवल InnoDB या MyISAM संग्रहण इंजन चलाने वाली तालिकाओं पर किया जा सकता है।
  • FULLTEXT इंडेक्स केवल CHAR, VARCHAR, या TEXT कॉलम के लिए बनाए जा सकते हैं।
  • FULLTEXT इंडेक्स का उपयोग केवल तभी किया जाता है जब MATCH() AGAINST() क्लॉज का उपयोग किया जाता है।
  • पूर्ण-पाठ खोजों में तीन मोड होते हैं:प्राकृतिक भाषा मोड, बूलियन मोड और क्वेरी विस्तार मोड।

एक FULLTEXT अनुक्रमणिका एक विशेष प्रकार का अनुक्रमणिका है जो अनुक्रमणिका में मानों की तुलना करने के बजाय पाठ में कीवर्ड ढूंढता है। हालांकि FULLTEXT खोज अन्य प्रकार के मिलान से अलग है, ध्यान दें कि आपके पास एक ही कॉलम पर एक ही समय में एक BTREE अनुक्रमणिका और एक FULLTEXT अनुक्रमणिका हो सकती है - वे विरोध नहीं करेंगे क्योंकि वे विभिन्न उद्देश्यों के लिए उपयुक्त हैं।

पूर्ण-पाठ खोज प्रकार

MySQL में पूर्ण-पाठ खोज चलाते समय, ध्यान रखें कि चुनने के लिए तीन खोज प्रकार हैं:

  1. एक प्राकृतिक भाषा खोज प्रकार - ऐसा खोज मोड खोज स्ट्रिंग को एक शाब्दिक वाक्यांश के रूप में व्याख्यायित करता है। डिफ़ॉल्ट रूप से सक्षम यदि कोई संशोधक निर्दिष्ट नहीं है या जब प्राकृतिक भाषा मोड संशोधक निर्दिष्ट है;
  2. एक क्वेरी विस्तार खोज प्रकार - ऐसा खोज मोड दो बार खोज करता है। दूसरी बार खोज करते समय, परिणाम सेट में पहली खोज के कुछ सबसे प्रासंगिक दस्तावेज़ शामिल होते हैं। क्वेरी विस्तार के साथ संशोधक का उपयोग करके सक्षम किया गया;
  3. एक बूलियन खोज प्रकार - ऐसा खोज मोड जटिल प्रश्नों की खोज को सक्षम बनाता है जिसमें बूलियन ऑपरेटर शामिल हो सकते हैं जैसे ("<") से कम और (">") से अधिक ऑपरेटर, सबएक्सप्रेशन ("( "और ")"), प्लस (+) चिह्न, ऋण (-) चिह्न, दोहरे उद्धरण (""), एक ऑपरेटर जो परिणामों में मूल्य के योगदान को कम करता है (~) और वाइल्डकार्ड ऑपरेटर (*) - वाइल्डकार्ड ऑपरेटर अस्पष्ट मिलान के साथ खोज करने की अनुमति देता है (उदाहरण के लिए, "डेमो*" "प्रदर्शन" से भी मेल खाएगा)। IN बूलियन मोड संशोधक का उपयोग करके सक्षम किया गया।

प्राकृतिक भाषा खोज मोड के साथ पूर्ण-पाठ खोज

एक प्राकृतिक भाषा खोज मोड, जैसा कि ऊपर बताया गया है, डिफ़ॉल्ट रूप से या जब प्राकृतिक भाषा मोड में संशोधक निर्दिष्ट किया जाता है, तब सक्षम किया जाता है। यह मोड किसी दिए गए टेक्स्ट संग्रह (एक या अधिक कॉलम) के विरुद्ध एक प्राकृतिक भाषा खोज करता है। MySQL में पूर्ण-पाठ खोजों का मूल क्वेरी प्रारूप निम्न के जैसा होना चाहिए:

SELECT * FROM table WHERE MATCH(column) AGAINST(“string” IN NATURAL LANGUAGE MODE);

जब MATCH() का उपयोग WHERE क्लॉज के साथ किया जाता है, तो पंक्तियों को स्वचालित रूप से उच्चतम प्रासंगिकता द्वारा क्रमबद्ध किया जाता है। सटीक स्ट्रिंग खोजने के लिए, इसे दोहरे उद्धरण चिह्नों के साथ संलग्न करें।

क्वेरी विस्तार मोड के साथ पूर्ण-पाठ खोज

पूर्ण-पाठ खोज भी क्वेरी विस्तार मोड का समर्थन करती है। इस तरह के खोज मोड का उपयोग अक्सर तब किया जाता है जब उपयोगकर्ता निहित ज्ञान पर निर्भर करता है - उदाहरण के लिए, उपयोगकर्ता खोज परिणामों में "मोंगोडीबी" और "माईएसक्यूएल" दोनों को देखने की उम्मीद में "डीबीएमएस" खोज सकता है। इस तरह के खोज मोड का उपयोग करते समय उपयोगकर्ता कुछ निहित ज्ञान पर भरोसा करने में सक्षम हो सकता है, इसका कारण बहुत आसान है - क्वेरी विस्तार मोड के साथ एक पूर्ण-पाठ खोज दो बार खोज करके काम करती है:दूसरा खोज वाक्यांश पहला खोज वाक्यांश है पहली खोज से कुछ सबसे अधिक प्रासंगिक प्रविष्टियों के साथ जुड़ा हुआ है। इसका मतलब है कि, उदाहरण के लिए, यदि पहली खोज में पंक्तियों में से एक में "DBMS" शब्द और "MySQL" शब्द होगा, तो दूसरी खोज में वे प्रविष्टियाँ मिलेंगी जिनमें "MySQL" शब्द शामिल होगा, भले ही वे न हों "डीबीएमएस" शामिल है। क्वेरी विस्तार मोड का उपयोग करने वाला क्वेरी प्रारूप ऐसा दिखाई देगा:

SELECT * FROM table WHERE MATCH(column) AGAINST(“string” WITH QUERY EXPANSION); 

बूलियन मोड का उपयोग करके पूर्ण-पाठ खोज

बूलियन मोड शायद सबसे दिलचस्प चीजों में से एक है जो MySQL पूर्ण-पाठ खोज पेश करता है। इस मोड में इसके लिए अद्वितीय कई चेतावनी हैं क्योंकि यह आपको बूलियन ऑपरेटरों का उपयोग करके खोज क्षमताओं का विस्तार करने की अनुमति देती है। जब बूलियन मोड उपयोग में होता है, तो कुछ वर्णों का शब्दों के आरंभ या अंत में विशेष अर्थ हो सकता है। उदाहरण के लिए:

  • “+” का अर्थ है और;
  • “-” का मतलब नहीं है;
  • “(“ और “)” ऑपरेटर सबएक्सप्रेशन बनाने की अनुमति देते हैं;
  • “<” और “>” ऑपरेटर खोज मान की रैंक को कम या ज्यादा करते हैं;
  • “~” खोज परिणामों में मूल्य के योगदान को कम करता है;
  • डबल कोट्स ("") केवल शाब्दिक मूल्यों से मेल खाते हैं;
  • “*” एक वाइल्डकार्ड ऑपरेटर है (उपरोक्त विवरण देखें)।

ये ऑपरेटर आपको खोज की कार्यक्षमता का विस्तार करने की अनुमति देते हैं:उदाहरण के लिए, यदि आप "डेमो" शब्द वाली सभी पंक्तियों को पुनः प्राप्त करना चाहते हैं, लेकिन "डेमो 2" नहीं, तो आप एक क्वेरी का उपयोग कर सकते हैं इस तरह:

SELECT * FROM table WHERE MATCH(column) AGAINST (“+Demo -Demo2” IN BOOLEAN MODE);

आप सिंगल कोट्स के साथ डबल कोट्स का भी उपयोग कर सकते हैं जैसे:

SELECT * FROM table WHERE MATCH(column) AGAINST(‘“search string”’ IN BOOLEAN MODE);

पूर्ण-पाठ खोज गोचास

MySQL में पूर्ण-पाठ खोज का उपयोग करने से पहले, ध्यान रखें कि खोज में कुछ "गॉथचास" हैं:

  • InnoDB और MyISAM स्टोरेज इंजन दोनों के पास स्टॉपवर्ड की अपनी सूचियां हैं। InnoDB स्टॉपवर्ड सूची यहां पाई जा सकती है, MyISAM स्टॉपवर्ड सूची यहां पाई जा सकती है।
    • InnoDB के लिए अपनी स्वयं की स्टॉपवर्ड सूची को परिभाषित करने के लिए, INNODB_FT_DEFAULT_STOPWORD तालिका के समान संरचना वाली तालिका को परिभाषित करें, वहां स्टॉपवर्ड डालें, फिर db_name/table_name के रूप में innodb_ft_server_stopword_table विकल्प का मान सेट करें।
    • MyISAM के लिए अपनी स्वयं की स्टॉपवर्ड सूची को परिभाषित करने के लिए, ft_stopword_file चर को स्टॉपवर्ड सूची वाली फ़ाइल के पथ नाम पर सेट करें। फ़ाइल में स्टॉपवर्ड को "_" और "'" को छोड़कर किसी भी गैर-अक्षर से अलग किया जा सकता है। डिफ़ॉल्ट स्टॉपवर्ड फ़ाइल स्टोरेज/मायिसम/ft_static.c पर स्थित है। वेरिएबल को एक खाली स्ट्रिंग पर सेट करके स्टॉपवर्ड को अक्षम किया जा सकता है।
  • विभाजित तालिकाओं पर पूर्ण-पाठ खोज समर्थित नहीं हैं।
  • FULLTEXT अनुक्रमणिका के सभी स्तंभों में समान वर्ण सेट और संयोजन का उपयोग किया जाना चाहिए।
  • पूर्ण-पाठ खोज ऑपरेशन % स्ट्रिंग को वाइल्डकार्ड के रूप में नहीं मानते हैं।

यहां एक और पकड़ है:आप यह भी ध्यान रखना चाहेंगे कि अंतर्निहित FULLTEXT पार्सर यह निर्धारित करता है कि स्पेस सहित कुछ वर्णों को देखकर शब्द कहां से शुरू और समाप्त होते हैं (" "), अल्पविराम (", ”) और अवधि (“।”) का अर्थ है कि यदि आपकी खोज स्ट्रिंग में उनमें से एक या अधिक वर्ण हैं, तो खोज परिणाम सटीक नहीं हो सकते हैं। उदाहरण के लिए, यदि आपके डेटाबेस में "test.demo" स्ट्रिंग के साथ 5 पंक्तियाँ हैं, तो खोज क्वेरी "test.demo" "डेमो", "string.demo_example" आदि सहित अधिक (10, 15 आदि) परिणाम लौटा सकती है क्योंकि यह "test.demo" के बजाय "डेमो" की खोज करने जा रहा है, इसलिए आप बहुत सारे अप्रासंगिक मैचों के साथ फंस सकते हैं। यदि आप C या C++ में अपना स्वयं का प्लगइन लिखने के इच्छुक हैं तो MySQL इस समस्या के लिए एक समाधान प्रदान करता है (MySQL दस्तावेज़ देखें), लेकिन तब तक, आप बहुत कुछ नहीं कर सकते।

MySQL के पूर्ण-पाठ प्रतिबंधों की पूरी सूची MySQL के दस्तावेज़ीकरण पृष्ठ पर देखी जा सकती है।

सारांश

MySQL पूर्ण-पाठ खोज क्षमता आपके MySQL चलाने वाले एप्लिकेशन में विभिन्न खोज तकनीकों (प्राकृतिक भाषा खोज, क्वेरी विस्तार खोज, और बूलियन खोज) को लागू करने का एक आसान तरीका प्रदान करती है। उन खोज तकनीकों में से प्रत्येक की अपनी चेतावनी होती है और उनमें से प्रत्येक अलग-अलग उद्देश्यों के लिए उपयुक्त हो सकती है - यह तय करते समय कि पूर्ण-पाठ खोज का उपयोग करना है या नहीं, ध्यान रखें कि इस प्रकार की खोज में कई सूक्ष्मताएं हैं जो स्वयं के लिए अद्वितीय हैं, दोनों लाभों को जानें और MySQL में पूर्ण-पाठ खोज का उपयोग करने के नुकसान और बुद्धिमानी से चुनें।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL के साथ STRAIGHT_JOIN का उपयोग कब करें

  2. दूरस्थ MySQL कनेक्शन सक्षम करें:त्रुटि 1045 (28000):उपयोगकर्ता के लिए प्रवेश निषेध

  3. ClusterControl 1.7.2 की घोषणा:TimescaleDB और MySQL 8.0 के लिए बेहतर पोस्टग्रेएसक्यूएल बैकअप और समर्थन

  4. PHP:चेतावनी:सॉर्ट () पैरामीटर 1 को सरणी, संसाधन दिए जाने की अपेक्षा करता है

  5. MySQL में कोलेशन कैसे खोजें