2009-06-24 13 views
8

मैं MySQL के साथ एक मूल पूर्ण-पाठ खोज को कार्यान्वित करने की कोशिश कर रहा हूं।रेल पर रूबी में MySQL पूर्ण-पाठ खोज


def self.up 
    execute 'ALTER TABLE photos ENGINE = MyISAM' 
    execute 'CREATE FULLTEXT INDEX fulltext_photos ON photos (place, info)' 
end 

def self.down 
    execute 'ALTER TABLE photos ENGINE = InnoDB' 
    execute 'DROP INDEX fulltext_photos ON photos' 
end 

और यहाँ अपने मॉडल है::

मैं इस प्रवास लिखा


def self.search(*args) 
    options = args.extract_options! 
    find_by_sql [ "SELECT * FROM photos WHERE MATCH (place, info) AGAINST (?)", options[:query] ] 
end 

समस्या यह है कि इस कोड हमेशा एक खाली सरणी देता है।

उदाहरण के लिए:

% Photo.find(:first) 
=> Photo id: 1, place: "Baceno", info: "Era immerso in erba alta." ... 

% Photo.search(:all, :query => 'baceno') 
=> []
+0

यह माइग्रेशन स्क्रिप्ट बहुत अच्छा काम करती है, लेकिन स्वयं को। डील विधि में ऑर्डर वापस करने के लिए याद रखें, तालिका को वापस InnoDB में बदलने से पहले इंडेक्स को हटा दिया जाना चाहिए अन्यथा आपको विफलता मिलती है। –

उत्तर

9

मैं एक परियोजना बनाई गई इस अनुकरण करने के लिए (रेल 2.3.2, रूबी MySQL 5.0 1.9.1)। डेटाबेस में एक रिकॉर्ड के साथ, मुझे वही परिणाम मिल गए जो आपने किया था। जब मैंने और रिकॉर्ड जोड़े, तो Photo.search कमांड को रिकॉर्ड मिला।

ऐसा इसलिए हो सकता है क्योंकि "50% या अधिक पंक्तियों में मौजूद शब्द सामान्य मानते हैं और मेल नहीं खाते हैं"। Ref.

50% दहलीज द्विआधारी मोड में लागू नहीं होती है। Ref.

द्विआधारी मोड में

कोष्ठकों के अंदर अंतर्गत आता है: के खिलाफ (बूलियन मोड में 'baceno')

+0

बिल्कुल सही ... अब यह सब स्पष्ट है! – collimarco

1

अपने परीक्षण (बस MySQL में, रेल में नहीं) जब मैं SELECT कथन को बूलियन मोड में विकल्प जोड़ने में , ऐसा लगता है कि पंक्तियां वापस आती हैं।

SELECT * FROM photos WHERE MATCH (place, info) AGAINST (?) IN BOOLEAN MODE 

मैं खोज के लिए सोलर या स्फिंक्स जैसे एक अलग खोज उत्पाद का उपयोग करने की भी सिफारिश करता हूं।

2

नीचे दिया गया कोड मेरे वेब पेज के लिए चलाता है और रेल पर रूबी में सही परिणाम देता है।

Adverse.find(:all, :conditions => ["match(related_company,client_name) against (? IN BOOLEAN MODE)",@chk]) 
संबंधित मुद्दे