Когда болит ЧиЧиЧиПи!
Пока в отпуске, попробую вернуться к более регулярным постам.
Помню монолог Михаила Задорного про ЧиЧиЧиПи. Если вы не столь стары, чтобы помнить его, вот видео.
В прошлом посте мы говорили о том, что 1, 2, 4, 8 — это не про степень двойки, а про степень доверия к совпадению.
Но есть нюанс.
Взвешенный поиск работает только тогда, когда вы сравниваете одинаковые значения. А если данные разные уже на входе — можно сколько угодно считать баллы, результат все равно будет странным.
Поэтому если вы полезли в поиск,
заниматься им без нормализации — грешно.
Нормализация — это приведение данных к виду, в котором их можно честно сравнивать.
Чтобы:
AB-123 45
ab12345
АВ 123-45
вдруг оказались одним и тем же значением.
В поиске обычно нормализуют:
– цифры
– буквы
– регистр
– алфавиты
– форматы и разделители
И вот тут ЧиЧиЧиПи начинает болеть.
Например, популярный прием —
«удалим все, что не подходит под маску». Если пользователь ввел данные в другом layout’е или на национальной клавиатуре, алгоритм может выкинуть вообще все символы.
Получается пустая строка.
А дальше — сюрприз:
две пустые строки могут совпадать всегда или никогда — зависит от реализации.
Дальше — буквы.
Upper case или lower case?
Кажется, что все просто, но Unicode умеет удивлять.
То, что безопасно для кодов, плохо подходит для текста — и наоборот.
И, конечно, транслитерация.
Она не одна.
ФИО транслитерируются по правилам языка.
А вот номера еще и по внешнему виду символов.
Поэтому:
Р → P
С → C
Х → X
и получается PCX, а не «RSH».
Это уже правила визуального соответствия.
Отсюда вывод простой:
• разные данные → разная нормализация
• один универсальный алгоритм не работает
• нормализация — это часть бизнес-логики, а не предобработка
А в следующем посту расскажу, как моя любовь к словарям меня же и покарала!
Post #758
439