2009-06-24 73 views
8

我想實現與MySQL基本的全文搜索。MySQL的全文搜索on Rails的

我寫了這個遷移:


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

這個遷移腳本效果很好,但記住要恢復self.down方法中的順序,在將表更改回InnoDB之前必須刪除索引,否則您會失敗。 – 2014-06-12 04:06:35

回答

9

我創建了一個項目(線路2.3.2,1.9.1 MySQL 5.0中)來模擬此。在數據庫中有一條記錄,我得到了相同的結果。當我添加更多記錄時,Photo.search命令找到了該記錄。

這可能是因爲「存在於該行的50%以上被認爲是常見的,不匹配的話」。 Ref.

的50%閾值不以二進制模式適用。 Ref.

二進制模式所屬的括號內:AGAINST( '巴切諾' IN BOOLEAN MODE)

+0

完美的......現在一切都清楚了! – collimarco 2009-06-26 11:26:32

1

在我的測試(只是在MySQL,而不是在Rails)的,當我在布爾模式的選項添加到SELECT語句,它似乎返回行。

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

我也建議使用一個單獨的搜索產品,如Solr的或獅身人面像進行搜索。

2

下面的代碼爲我的網頁運行,並在rails上提供正確的ruby結果。

Adverse.find(:all, :conditions => ["match(related_company,client_name) against (? IN BOOLEAN MODE)",@chk])