【发布时间】:2014-11-28 21:05:39
【问题描述】:
我在 mySQL 中维护一个音乐数据库,我如何返回存储在 e.g.当人们搜索“Tiesto”时出现“Tiësto”?
所有数据都存储在全文索引下,如果这有什么不同的话。
我已经在 PHP 中使用了 Levenshtein,在 SQL 中使用了 REGEXP - 不是为了解决这个问题,而是为了提高一般的可搜索性。
PHP:
function Levenshtein($word) {
$words = array();
for ($i = 0; $i < strlen($word); $i++) {
$words[] = substr($word, 0, $i) . '_' . substr($word, $i);
$words[] = substr($word, 0, $i) . substr($word, $i + 1);
$words[] = substr($word, 0, $i) . '_' . substr($word, $i + 1);
}
$words[] = $word . '_';
return $words;
}
$fuzzyartist = Levenshtein($_POST['searchartist']);
$searchimplode = "'".implode("', '", $fuzzyartist)."'";
mySQL:
SELECT *
FROM new_track_database
WHERE artist REGEXP concat_ws('|', $searchimplode);
补充一点,我经常在 PHP 中执行字符集转换和字符串清理,但这些一直是另一种方式 - 标准化非拉丁字符。我无法理解执行相反的过程,但仅在某些情况下基于我存储的数据。
【问题讨论】:
-
我已经在查询中使用了正则表达式;而且我还不够熟练,不知道如何组合多个正则表达式,如果这确实可能的话。因此,也许这个讨论仍然可以得到一些有用的东西。
-
将数据存储在 MySQL 中,既可以作为原始版本,也可以作为仅包含拉丁字符的净化、可搜索版本?
-
这是个好主意,wavemode。仅为全文搜索目的创建重复表并不麻烦。谢谢。
-
您是否尝试过设置 utf8_unicode_ci 的集合,然后在运行常规查询期间?
标签: php mysql regex search levenshtein-distance