【问题标题】:MySQL Full-text search in Ruby on RailsRuby on Rails 中的 MySQL 全文搜索
【发布时间】:2009-06-24 16:39:02
【问题描述】:

我正在尝试使用 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)
=> 照片编号:1,地点:“Baceno”,信息:“Era immerso in erba alta。” ...

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

【问题讨论】:

  • 这个迁移脚本很好用,但记得在 self.down 方法中恢复顺序,在将表更改回 InnoDB 之前必须删除索引,否则会失败。

标签: mysql ruby-on-rails full-text-search


【解决方案1】:

我创建了一个项目(Rails 2.3.2、Ruby 1.9.1 MySQL 5.0)来模拟这个。通过数据库中的一条记录,我得到了与您相同的结果。当我添加更多记录时,Photo.search 命令找到了该记录。

这可能是因为“出现在 50% 或更多行中的单词被认为是常见的并且不匹配”。 Ref.

50% 阈值不适用于二进制模式。 Ref.

IN BINARY MODE 属于括号内:AGAINST ('baceno' IN BOOLEAN MODE)

【讨论】:

    【解决方案2】:

    查看Thinking Sphinx gem。太好了。

    【讨论】:

    • ThinkingSphinx Gem 运行良好,但请注意使用 Sphinx 会增加一些显着开销:例如,必须在服务器上安装 Sphinx,sphinx 搜索不返回 ActiveRecord::Relations,因此您必须复制代码而不是如果您的标准不仅仅是文本搜索,则链接范围,如果您想测试全文搜索结果,则需要额外的测试设置,必须使 Sphinx 索引与不断变化的数据保持同步等。我们一直在生产中使用 ThinkingSphinx几年来取得了不错的成功,但增加的开发、测试和部署工作可能是 PITA。
    【解决方案3】:

    下面的代码为我的网页运行,并在 ruby​​ on rails 中给出了正确的结果。

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

    【讨论】:

      【解决方案4】:

      在我的测试中(仅在 MySQL 中,而不是在 Rails 中),当我将 IN BOOLEAN MODE 选项添加到 SELECT 语句时,它似乎返回行。

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

      我还建议使用单独的搜索产品,如 Solr 或 Sphinx 进行搜索。

      【讨论】:

        猜你喜欢
        • 2011-05-29
        • 2010-09-08
        • 2010-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多