mySQL — сопоставление латинской (английской) формы ввода с данными utf8 (не английскими)

Я поддерживаю музыкальную базу данных в 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, но это всегда был ДРУГОЙ способ — стандартизация нелатинских символов. Я не могу сосредоточиться на выполнении противоположного процесса, но только в определенных обстоятельствах, основываясь на данных, которые я сохранил.

1

Решение

Возможным решением было бы создание другого столбца в базе данных рядом с «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 или выше с международный расширение.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]