我有一个带有标签(单词)的表格。每当我想在表格中添加一个新项目(单词)时,我想首先看到的单词看起来最像我正在输入的单词,所以我可以意识到我已经在表格中看到了一个看起来像这样的单词
有点像在Mysql中使用match()函数,但我不想要对应多少单词的分数。但是在一个单词中得分,有多少个字符对应。
类似于:select * from tags order by look_a_like_score(@newword)
但是有没有像look_a_like_score()这样的函数?
示例,我已经在表中:
餐厅
电梯
游泳池
无线上网的
现在我要添加:
免费游泳设施
我现在想要的是一个带有“游泳池”的列表,因为“游泳”部分最匹配。
你能帮我这么做吗?
PS。我将整个表收集到PHP中,然后将它们放入一个数组中。因此,欢迎使用PHP方法。
答案 0 :(得分:3)
在MySQL方面,你有soundex,并不像我喜欢的那样工作得很好。 你可能想要实现一个MySQL模块来使用levenshtein(你需要在C中编译)。
在PHP方面你有levenshtein()可用,这是相当不错的相似性得分
您也可以使用:
soundex() - 计算字符串的soundex键
similar_text() - 计算两个字符串之间的相似性
metaphone() - 计算字符串的metaphone键
查看手册以了解如何使用它们
答案 1 :(得分:0)
您可以在here查看levenshtein distance公式的实现,这有助于找到字符串之间的编辑距离。
可能对你有用的其他事情是使用soundex或可能double metaphone来做“听起来像”匹配。
答案 2 :(得分:0)
没有任何功能。但是,你可以用一些SQL来做到这一点。我假设@newtag包含您的新标记,并且您有一个numbers
表。你可以这样做:
select t.tag, max(len) as biggestmatch
from (select concat('%', substr(@newtag, n1.n, n2.n), '%') as pat,
n1.n as start, n2.n as len
from numbers n1 cross join
numbers n2
where n1.n <= length(@newtag) and n1+n2 <= length(@newtag)
) patterns join
tags t
on t.tag like patterns.pat
group by t.tag
order by max(len)
limit 1 /* you only need this if you want the best one */
我不承诺这会表现得特别好。但是对于一些不太长的标签和字符串,它可能适合您的目的。