Я поддерживаю музыкальную базу данных в MySQL, как мне возвращать результаты, хранящиеся, например, в. «Tiësto», когда люди ищут «Tiesto»?
Все данные хранятся при полнотекстовой индексации, если это имеет значение.
Я уже использую комбинацию Левенштейна в PHP и REGEXP в SQL — не для того, чтобы решить эту проблему, а просто для повышения возможности поиска в целом.
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, но это всегда был ДРУГОЙ способ — стандартизация нелатинских символов. Я не могу сосредоточиться на выполнении противоположного процесса, но только в определенных обстоятельствах, основываясь на данных, которые я сохранил.
Возможным решением было бы создание другого столбца в базе данных рядом с «artist», например, «artist_normalized». Здесь, заполняя таблицу, вы можете вставить «нормализованную» версию строки. Затем можно выполнить поиск по столбцу artist_normalized.
Тестовый код:
<?php
$transliterator = Transliterator::createFromRules(':: NFD; :: [:Nonspacing Mark:] Remove; :: NFC;', Transliterator::FORWARD);
$test = ['abcd', 'èe', '€', 'àòùìéëü', 'àòùìéëü', 'tiësto'];
foreach($test as $e) {
$normalized = $transliterator->transliterate($e);
echo $e. ' --> '.$normalized."\n";
}
?>
Результат:
abcd --> abcd
èe --> ee
€ --> €
àòùìéëü --> aouieeu
àòùìéëü --> aouieeu
tiësto --> tiesto
Волшебство сделано классом Транслитератора. Указанное правило выполняет три действия: декомпозирует строку, удаляет диакритические знаки и затем повторно компоновывает строку, канонизирует.
Транслитератор в PHP построен на основе ICU, поэтому, делая это, вы опираетесь на таблицы библиотеки ICU, которые являются полными и надежными.
Примечание: это решение требует PHP 5.4 или выше с международный расширение.
Других решений пока нет …