इस लेख में हम Manticore Search के साथ SphinxSE और FEDERATED इंजन के उपयोग के बीच के अंतर पर चर्चा करते हैं।
SphinxSE MySQL प्लगइन Sphinx Search के पहले सार्वजनिक रिलीज के साथ उपलब्ध कराया गया था। विचार यह था कि उपयोगकर्ताओं को उसी MySQL कनेक्शन का उपयोग करके खोज प्रश्नों को करने की अनुमति दी जाए। एक और लाभ यह था कि खोज परिणाम को आगे की फ़िल्टरिंग/सॉर्टिंग के लिए या ऐसे डेटा को प्रदर्शित करने के लिए जो खोज परिणाम में उपलब्ध नहीं है, किसी अन्य MySQL तालिका के साथ जोड़ा जा सकता था। उस समय SphinxQL भी मौजूद नहीं था।
SphinxSE की एक समस्या यह है कि यह प्लगइन सभी MySQL फ्लेवर्स में शामिल नहीं है। वर्तमान में केवल MariaDB अपने बंडल किए गए प्लगइनों की सूची में SphinxSE को शामिल करता है। कोई व्यक्ति जो MySQL या Percona संस्करण का उपयोग कर रहा है, उसे MySQL के स्रोत डाउनलोड करने और SphinxSE प्लगइन को संकलित करने की आवश्यकता होगी, जो एक आउट-ऑफ-बॉक्स अनुभव नहीं है। MySQL को नए संस्करणों में अपग्रेड करने के लिए उस संस्करण के लिए फिर से संकलित करने की आवश्यकता हो सकती है, जिससे चीजें और भी कठिन हो गईं। SphinxSE का रखरखाव विकास पक्ष पर भी कठिन था: इसे MySQL API परिवर्तनों के साथ अद्यतित रखना आवश्यक था और चूंकि इसका अपना कस्टम खोज वाक्यविन्यास था, एक और क्वेरी पार्सर बनाए रखना था।
FEDERATED समर्थन जोड़ना
हाल ही में हमने Manticore Search में FEDERATED इंजन तालिका पर निष्पादित प्रश्नों के लिए समर्थन जोड़ा है। चूंकि FEDERATED सभी MySQL फ्लेवर्स में डिफ़ॉल्ट रूप से शामिल है, कोई विशेष सेटअप या संकलन की आवश्यकता नहीं है। आपको बस इतना करना है कि एक FEDERATED तालिका बनाना है जो Manticore SphinxQL से लिंक करती है और आप खोज प्रश्नों का निष्पादन कर सकते हैं।
SphinxSE को प्रश्न को विशेष प्रारूप में भेजने की आवश्यकता है, जैसे कि सेमीकॉलन से विभाजित एक पैरामीटर श्रृंखला जैसे:
WHERE query='test;filter=cat_id,1,5,10;groupby=day:published_ts;fieldweights=title,10,abstract,3,content,1;'
यह वाक्यविन्यास सभी सुविधाओं को कवर नहीं करता, उदाहरण के लिए GROUP N BY करने की क्षमता।
FEDERATED में, प्रश्न स्ट्रिंग एक पूर्ण SphinxQL SELECT कमांड है:
WHERE query='SELECT * FROM test_index WHERE MATCH (\'test\') AND ANY(cat_id) IN (1,5,10 GROUP BY day,published_ts OPTION field_weights=(title=10,abstract=3,content=1)';
पूर्ण खोज सुविधाओं के साथ, SphinxQL प्रश्न पोर्टेबिलिटी प्रदान करते हैं, जिससे परीक्षण करना आसान हो जाता है (mysql क्लाइंट का उपयोग करके)।
सीमाएँ
Manticore से जुड़े FEDERATED तालिका का एक समान स्कीमा है, जैसे SphinxSE तालिका: प्रश्न स्ट्रिंग के लिए एक अनिवार्य कॉलम है। खोज परिणामों से एट्रिब्यूट मान प्राप्त करने के लिए, उन्हें तालिका में घोषित कॉलम होने की आवश्यकता होती है।
कुछ लोग पूछ सकते हैं कि SphinxQL प्रश्न को सीधे चलाना संभव क्यों नहीं है, इसके बजाय इसे एक स्ट्रिंग कॉलम में डालने के। सबसे बड़ी समस्या यह है कि SphinxQL में कस्टम क्लॉज हैं, जैसे MATCH(), और MySQL पार्सर इसे पहचान नहीं पाता। FEDERATED में कुछ सीमाएँ भी हैं, उदाहरण के लिए यह LIMIT क्लॉज को नजरअंदाज करता है।
एक और सीमा MySQL तालिका के साथ जोड़ने से संबंधित है ताकि अतिरिक्त फ़िल्टरिंग या सॉर्टिंग/ग्रुपिंग का संचालन किया जा सके। जोड़ना Manticore खोज प्रश्न द्वारा प्रदान किए गए परिणाम सेट के साथ किया जाता है। यदि आपको उदाहरण के लिए, एक कॉलम के साथ क्रमबद्ध करने की आवश्यकता हो जो MySQL तालिका से है और जिसे पूरे खोज पर लागू करने की आवश्यकता है, तो पूरे परिणाम सेट को Manticore से लाया जाना चाहिए। यह बड़े परिणामों पर एक समस्या हो सकती है। यह बेहतर हो सकता है कि आवश्यक कॉलम को Manticore में जोड़ा जाए और Manticore में इच्छित ऑपरेशन किया जाए।
FEDERATED तालिका परिभाषा में उपयोग किया जाने वाला Manticore इंडेक्स एक स्टोरेज वाला (सादा या रियलटाइम) इंडेक्स होना चाहिए।
टेक्स्ट हाइलाइटिंग
FEDERATED के साथ, यह केवल MySQL में संग्रहीत टेक्स्ट पर स्निपेटिंग करना संभव है। सेटअप के लिए एक द्वितीयक FEDERATED तालिका की आवश्यकता होती है, जिसका उपयोग SELECTS को SNIPPET फ़ंक्शन के साथ करने के लिए किया जाएगा। हम एक उदाहरण पर विचार करेंगे जिसमें विकिपीडिया लेख हैं, जहां हम केवल लेख का आईडी और शीर्षक प्राप्त करना चाहते हैं (जो हमारे इंडेक्स में संग्रहीत नहीं है):
सबसे पहले हम FEDERATED तालिका को घोषित करते हैं, जहां WikiSearch
वास्तविक खोज करने के लिए उपयोग किया जाएगा और WikiSnippet
स्निपेटिंग के लिए SELECT के लिए:
CREATE TABLE WikiSearch
(
id INTEGER UNSIGNED NOT NULL,
query VARCHAR(1024) NOT NULL,
INDEX(query)
) ENGINE=FEDERATED
DEFAULT CHARSET=utf8
CONNECTION='mysql://[email protected]:9306/DB/wikipedia';
CREATE TABLE WikiSnippet
(
id INTEGER UNSIGNED NOT NULL,
snippets VARCHAR(1024) NOT NULL,
query VARCHAR(1024) NOT NULL,
INDEX(query)
) ENGINE=FEDERATED
DEFAULT CHARSET=utf8
CONNECTION='mysql://[email protected]:9306/DB/wikipedia';
हम Manticore से विकिपीडिया इंडेक्स पर खोज करने जा रहे हैं और परिणाम को MySQL के विकिपीडिया तालिका (जिसे wikipediaTable
कहा जाता है) के साथ जोड़ते हैं। जुड़ाव से प्राप्त id
और article
का उपयोग करके हम प्रत्येक लेख के लिए एक व्यक्तिगत SELECT करेंगे जो स्निपेट लौटाएगा।
mysql> SELECT id,
(SELECT snippets FROM WikiSnippet WHERE query=concat('SELECT SNIPPET(\'',a.title,'\',\'town\') AS snippets FROM wikipedia WHERE id=',a.id)) AS snippet
FROM ( SELECT WikiSearch.id,wikipediaTable.title FROM WikiSearch JOIN wikipediaTable ON WikiSearch.id=content.id WHERE
query='SELECT id FROM wikipedia WHERE match(\'@title town\')') a;
+-----------+----------------------------------------------------------+
| id | snippet |
+-----------+----------------------------------------------------------+
| 221741590 | न्यू इंग्लैंड <b>टाउन</b> |
| 225879601 | <b>टाउन</b> बैठक |
| 227372942 | हडर्सफील्ड <b>टाउन</b> एफ.सी. |
| 227789260 | केप <b>टाउन</b> |
| 228005065 | लिंकन <b>टाउन</b> कार |
| 228031371 | स्विंडन <b>टाउन</b> एफ.सी. |
| 228037958 | न्यूबर्ग (<b>टाउन</b>), न्यू यॉर्क |
| 209273335 | लुईस्टन (<b>टाउन</b>), न्यू यॉर्क |
| 218353936 | केप <b>टाउन</b> के उपनगरों की सूची |
| 218900544 | न्यू <b>टाउन</b>, प्राग |
| 219113587 | स्विंडन <b>टाउन</b> एफ.सी. का इतिहास |
| 221331452 | क्रिसलर <b>टाउन</b> और कंट्री |
| 222331137 | आइपस्विच <b>टाउन</b> एफ.सी. के आंकड़े और रिकॉर्ड |
| 225807671 | ईस्ट हैम्पटन (<b>टाउन</b>), न्यू यॉर्क |
| 226345846 | पुराना <b>टाउन</b> |
| 226474919 | सेंकांग न्यू <b>टाउन</b> |
| 227031418 | कैम्ब्रिज <b>टाउन</b> |
| 227043533 | संयुक्त राज्य अमेरिका में <b>टाउन</b> ट्रामवे प्रणालियों की सूची |
| 227328024 | भूत <b>टाउन</b> |
| 227337559 | <b>टाउन</b> |
+-----------+----------------------------------------------------------+
20 rows in set (0.01 sec)
अधिक जानकारी के लिए, FEDERATED समर्थन पृष्ठ पर जाएं जो आधिकारिक दस्तावेज़ में है।