【发布时间】:2013-02-02 02:46:01
【问题描述】:
我有一个包含以下列的 MySQL 表:
City Country Continent
New York States Noth America
New York Germany Europe - considering there's one ;)
Paris France Europe
如果我想找到有错字的“New Yokr”,使用 MySQL 存储函数很容易:
$querylev = "select City, Country, Continent FROM table
WHERE LEVENSHTEIN(`City`,'New Yokr') < 3"
但如果有两个纽约城市,用全文搜索你可以输入“纽约州”,你会得到你想要的结果。
所以问题是,我可以搜索“New Yokr Statse”并获得相同的结果吗?
是否有任何功能可以合并 levenshtein 和 fulltext 以形成一个多合一的解决方案,或者我应该在 MySQL 中创建一个连接 3 列的新列?
我知道还有其他解决方案,例如 lucene 或 Sphinx(还有 soundex、metaphone,但对此无效),但我认为对我来说实施它们可能有点困难。
【问题讨论】:
-
首先,你自己试过吗?我认为您无法同时获得这两者,因为 New Yokr Statse 与纽约州的距离为 4。
-
你自己试试是什么意思?我正在尝试不同的方法,但远未达到解决方案:(例如将每个单词拆分为标记并调用 levenshtein 距离,但为此我必须拆分每个单词,这似乎不是一个好的解决方案跨度>
-
我的意思是您问“我可以搜索“New Yokr Statse”并获得相同的结果吗?” - 一个简单的测试会告诉你不。但是你也可以说“我如何修改它以接受另一种情况” - 从帖子中很难说。在这个结构下,我自己没有单独通过 mysql 的答案。除了大量数据收集和用户行为记录之外,我不知道如何可靠地存储和引用错误类型。就像“你的意思是”功能,这就是它的样子。
-
'SELECT CONCAT(city, ' ', country, ' ',continent) full FROM table UNION SELECT CONCAT(city, ' ', country) full FROM table UNION 'SELECT City full FROM table WHERE LEVENSHTEIN(Full, search Term)
-
嗯,让我们试试吧。我会告诉你的,谢谢!还在寻找方法:)
标签: php regex full-text-search regex-group levenshtein-distance