ऐसा प्रतीत होता है कि InnoDB टेबल एक ही MATCH()
में कई फुलटेक्स्ट इंडेक्स पर खोजों की अनुमति नहीं देते हैं हालत।
यहां आपके सभी फ़ील्ड एक ही टेबल से संबंधित नहीं हैं, इसलिए वे अलग-अलग इंडेक्स से आच्छादित हैं। ध्यान दें कि यदि आपके पास इस तरह की तालिका है तो वही सीमा लागू होती है:
CREATE TABLE t (
f1 VARCHAR(20),
f2 VARCHAR(20),
FULLTEXT(f1), FULLTEXT(f2)
) ENGINE=InnoDB;
SELECT * FROM t
WHERE MATCH(f1, f2) AGAINST ('something in f2'); -- likely to return no row
यह ऐसा दिखता है एक पूर्ण-पाठ खोज केवल पहले पूर्ण-पाठ अनुक्रमणिका पर खोज कर सकती है जिसका सामना करना पड़ता है लेकिन यह केवल कुछ ऐसा है जिसे मैं घटाता हूं इस अनुभव से , कृपया इसे हल्के में न लें।
लब्बोलुआब यह है कि आपको अपनी खोज को विभाजित करना चाहिए ताकि प्रति MATCH()
में एक एकल पूर्ण पाठ अनुक्रमणिका का उपयोग किया जा सके। खंड:
SELECT * FROM auction, user, gallery, ...
WHERE
MATCH(auction.field1, auction.field2) AGAINST ('search query' IN BOOLEAN MODE) OR
MATCH(auction.field3) AGAINST ('search query' IN BOOLEAN MODE) OR
MATCH(user.field1, user.field2, user.field3) AGAINST...
यह एक संभावित क्वेरी का एक उदाहरण है यदि आपके पास auction
. पर दो अलग-अलग इंडेक्स थे और एक user
. पर . आपको इसे अपनी वास्तविक संरचना के अनुकूल बनाने की आवश्यकता है (यदि आपको अधिक मार्गदर्शन की आवश्यकता है तो कृपया अपनी तालिका का विवरण पोस्ट करें)।
ध्यान दें कि यह केवल InnoDB तालिकाओं पर लागू होता है। दिलचस्प बात यह है कि MyISAM टेबल समान सीमा नहीं दिखाते हैं ।
अपडेट:पता चला कि यह InnoDB इंजन में एक बग
था। , 5.6.13/5.7.2 में नियत। उपरोक्त उदाहरण अब "स्तंभ सूची से मेल खाते FULLTEXT अनुक्रमणिका नहीं ढूंढ सकता" के साथ सही ढंग से विफल हो जाता है। दरअसल, (f1, f2)
. पर कोई इंडेक्स नहीं है , लेकिन एक (f1)
. पर और दूसरा (f2)
. पर . जैसा कि चेंजलॉग सलाह देता है :
यह उल्लेखनीय है कि इस तरह की क्वेरीज़ MyISAM के साथ सेट किए गए सही परिणाम लौटाती हैं, लेकिन वे अपेक्षा से अधिक धीमी गति से चलती हैं, जैसे वे चुपचाप मौजूदा पूर्ण-पाठ अनुक्रमणिका को अनदेखा कर देते हैं ।