我不太擅长正则表达式,所以我真的需要一些帮助来实现我的目标。
在数据库中搜索时,我使用特定关键字的别名。
这是一个例子
keyword tets alias test (someone have spell wrong then word test)
keyword b.m.w alias bmw (if someone write b.m.w instead of bmw)
等等
到目前为止,如果用户搜索“bmw 316”
,我会使用LIKE“%bmw%316%”
来获取结果。
现在,如果用户搜索 "b.m.w 316"
我必须使用
"%b.m.w%316%" OR
"%bmw%316%"
因为b.m.w
有别名bmw
。
对于 6 个单词和 2-3 个别名的情况,组合太多。
我正在尝试用正则表达式来实现它。
在上面的场景中,它会类似于 (bmw|b.m.w) 316
。
如何解决这个问题?
最佳答案
您不是在寻找REGEXP
,您正在寻找一个东西 called levenshtein distance
MySQL 还没有对这个(美妙的)概念提供 native 支持,但您可以在此处下载 UDF:
http://joshdrew.com/
这里有一个列表,以便您可以选择:
http://blog.lolyco.com/sean/2008/08/27/damerau-levenshtein-algorithm-levenshtein-with-transpositions/
您还可以在 MySQL 中编写自己的函数,因此无需安装 UDF。
http://www.supermind.org/blog/927/working-mysql-5-1-levenshtein-stored-procedure
最后这个问题也可能对您有所帮助:
Implementation of Levenshtein distance for mysql/fuzzy search?
最接近匹配的查询类似于:
SELECT * FROM atable a ORDER BY levenshtein(a.field, '$search') ASC LIMIT 10
关于mysql 正则表达式使用别名进行搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7269819/