我在基于RoR的网站上的搜索功能有点问题.我有很多产品带有一些代码.此代码可以是任何字符串,如"AB-123-lHdfj".现在我使用ILIKE运算符查找产品:

Product.where("code ILIKE ?", "%" + params[:search] + "%")

它工作正常,但找不到代码为"AB123 lHdfj"或"AB123lHdfj"的产品.

我该怎么办?也许Postgres有一些字符串规范化功能,或者其他一些方法可以帮助我?

推荐答案

Postgres提供了一个具有多个字符串比较功能的模块,如soundex和metaphone.但您需要使用levenshtein编辑距离功能.

Example:

test=# SELECT levenshtein('GUMBO', 'GAMBOL');
 levenshtein
-------------
           2
(1 row)

2是两个单词之间的编辑距离.当你对许多单词应用这个方法,并根据编辑距离结果进行排序时,你将得到你要寻找的模糊匹配类型.

try 以下查询示例:(当然,使用您自己的对象名称和数据)

SELECT * 
FROM some_table
WHERE levenshtein(code, 'AB123-lHdfj') <= 3
ORDER BY levenshtein(code, 'AB123-lHdfj')
LIMIT 10

这个问题说:

给出某个_表中所有数据的前10个结果,其中代码值和输入"AB123 lHdfj"之间的编辑距离小于3.您将返回代码值与'AB123 lHdfj'相差3个字符以内的所有行...

注意:如果出现如下错误:

function levenshtein(character varying, unknown) does not exist

使用以下方法安装fuzzystrmatch扩展插件:

test=# CREATE EXTENSION fuzzystrmatch;

Ruby-on-rails相关问答推荐

Rails7--如何使用内联代码仅为操作运行BEFORE操作

`heroku Open`和`heroku run rake db:Migrate`不工作(";没有这样的文件或目录";)

Ubuntu Webhooks无法读取安装的正确RVM Ruby

使用has_many_through关联创建记录 – Ruby on Rails

使用嵌套属性时如何自动将父 ID 分配为外键?

为什么 Rails 执行器不能识别内核的改进?

在bash中匹配带有空格字符的字符串

ViewModel 和 Controller 有什么区别?

您将如何在 Ruby on Rails 应用程序中使用 rSpec 测试观察者?

Time.zone.now.to_date 是否等同于 Date.today?

如何获取 Ruby on Rails 生成的表单元素 id 以供 JavaScript 参考?

从 Rails 生成 PDF

Gem 更新:在从 ASCII-8BIT 到 UTF-8 到 US-ASCII 的转换中,无法将 "\xE7" 转换为 UTF-8

安装mysql2(0.4.8)时出错,Bundler无法继续

如何在 routes.rb 中使用 301 或 302 进行重定向

可能在rails中有多态has_one关系?

Ruby on Rails:在模型中验证还是在数据库中验证更好?

删除链接在 Rails 3 视图中发送Get而不是Delete

在 PostgreSQL 中强制字符串的最大长度

redirect_to 和 render 是可交换的吗?