【问题标题】:ActiveRecord Fuzzy SearchActiveRecord 模糊搜索
【发布时间】:2016-04-06 02:38:42
【问题描述】:

我正在寻找类似这样的对象:

Object(id: 1, example: "abc")

通过使用这样的搜索:

params[:search] = "abcdef"
Object.where("example LIKE ?", "#{params[:search]%")

但是如果我的搜索字符少于我的对象而不是更多,我只能使用上面的示例。

【问题讨论】:

  • 我认为LIKE 的语法如下:LIKE '%?%'% 是通配符)。
  • 这毫无意义。您希望在有人搜索“同义词库”时出现带有example: "the" 的对象吗? LIKE 不是这样工作的,你不能让它这样工作。
  • 是的,我正在使用遗留代码,但我需要的关联不存在。我将尝试使用此搜索在具有不一致数据的对象之间临时建立一些关联。您对此有解决方案吗?

标签: ruby-on-rails ruby postgresql activerecord


【解决方案1】:

注意:模糊 gem 不适用于 Rails 6。此解决方案已被弃用。

fuzzily gem 允许您对已适当检测的 ActiveRecord 模型进行模糊搜索。

在海量字符串中模糊查找拼写错误、前缀或部分针。它是一个快速、基于 trigram、数据库支持的 Rails 模糊字符串搜索/匹配引擎。

安装 gem 后,您可以按如下方式检测模型:

class MyStuff < ActiveRecord::Base
  # assuming my_stuffs has a 'name' attribute
  fuzzily_searchable :name
end

然后您可以执行如下模糊搜索:

MyStuff.find_by_fuzzy_name('Some Name', :limit => 10)
# => records

【讨论】:

  • 不幸的是,这是真的! :(更新我的答案以反映这一点。感谢您指出:)
【解决方案2】:

我觉得应该是的

params[:search] = "abcdef"
Object.where("example LIKE ?", "%#{params[:search]}%")

还可能希望使用ilike 进行不区分大小写的搜索(如果您使用的是 postgres)

【讨论】:

  • @arel 不,它没有:它警告纯字符串条件,但这个用问号转义,所以没关系。
猜你喜欢
  • 2020-03-15
  • 2014-08-20
  • 2011-10-28
  • 2016-06-12
  • 2017-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-18
相关资源
最近更新 更多