簡體   English   中英

MySQL在Ruby on Rails上的全文搜索

[英]MySQL Full-text search in Ruby on Rails

我正在嘗試用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')
=> []

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

這可能是因為“50%或更多行中存在的單詞被認為是常見且不匹配”。 參考。

50%閾值不適用於二進制模式。 參考。

IN BINARY MODE屬於括號內:AGAINST('baceno'IN BOOLEAN MODE)

查看Thinking Sphinx寶石。 這很棒。

下面的代碼運行我的網頁,並在rails上的ruby中給出正確的結果。

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

在我的測試中(僅在MySQL中,而不是在Rails中)當我將選項IN BOOLEAN MODE添加到SELECT語句時,它似乎返回行。

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

我還建議使用單獨的搜索產品,如Solr或Sphinx進行搜索。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM