我在基于RoR的网站上的搜索功能有点问题.我有很多产品带有一些代码.此代码可以是任何字符串,如"AB-123-lHdfj".现在我使用ILIKE
运算符查找产品:
Product.where("code ILIKE ?", "%" + params[:search] + "%")
它工作正常,但找不到代码为"AB123 lHdfj"或"AB123lHdfj"的产品.
我该怎么办?也许Postgres有一些字符串规范化功能,或者其他一些方法可以帮助我?
我在基于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;