繁体   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