Мобільна клавіатура — джерело систематичних помилок. Swipe-введення, автозаміна, маленькі клавіші — середня кількість помилок при мобільному введенні в 2–3 рази вища, ніж при десктопному. Кожна п'ята помилка призводить до нульового результату пошуку, і користувач у 70% випадків закриває додаток після цього. Ми, як команда мобільних розробників з 5+ річним досвідом, щодня стикаємося з цією проблемою. Наші інженери, сертифіковані в AWS та Kubernetes, впровадили AI-виправлення помилок у 30+ проектах, знижуючи zero-result rate до 2% і збільшуючи конверсію пошуку на 9%. Наше рішення справляється з навантаженням понад 1000 запитів/сек і обробляє помилки за мілісекунди. Вартість базового впровадження — від 150 000 грн. Зв'яжіться з нами для безкоштовного аудиту ваших пошукових логів.
Типи помилок та підходи до виправлення
Помилки в мобільному введенні поділяються на три категорії, і для кожної потрібен свій інструмент:
- Помилки (transposition, deletion, substitution) — «кросівки» замість «кросівки». Обробляються алгоритмами редакційної відстані: Levenshtein (O(n²) складність), Damerau-Levenshtein (враховує транспозицію сусідніх символів, що типово для мобіля). Edit distance вимірює кількість символьних операцій.
- Фонетичні помилки — користувач пише як чує: «найк» → «nike», «адідас» → «adidas». Для російської мови: метафонний алгоритм або спеціалізований phonetic encoder під кирилицю.
- Транслітерація — «krossovki», «кросівки», «crossovki» повинні давати однаковий результат. Стандартні транслітераційні таблиці + нормалізація перед індексацією.
| Метод | Швидкість | Точність | Складність впровадження |
|---|---|---|---|
| Levenshtein | O(n²) | Середня (precision ~70%, recall ~60%) | Низька |
| SymSpell | O(1) lookup | Висока (precision ~85%, recall ~90%) | Середня |
| ES fuzzy + jaro_winkler | O(log n) | Низька (без контексту) | Низька (вбудований) |
| SymSpell + N-gram LM | O(1) + O(m) | Дуже висока (precision ~95%, recall ~97%) | Висока |
AI-виправлення помилок: SymSpell vs Levenshtein
Для продакшну при > 1000 запитів/сек стандартний Levenshtein не підходить через O(n²) складність. SymSpell (Symmetric Delete) попередньо обчислює всі можливі видалення до максимальної edit distance та зберігає в хеш-таблиці. Час пошуку — O(1) для більшості запитів. Як це виглядає на практиці:
from symspellpy import SymSpell, Verbosity
sym_spell = SymSpell(max_dictionary_edit_distance=2, prefix_length=7)
sym_spell.load_dictionary("ru_frequency_dict.txt", term_index=0, count_index=1)
def correct_query(query: str) -> str:
suggestions = sym_spell.lookup_compound(
query,
max_edit_distance=2,
transfer_casing=True
)
if suggestions and suggestions[0].distance > 0:
return suggestions[0].term
return query
Частотний словник для російської мови будуємо з пошукових логів додатку — це важливо: «шкіряний ремінь» буде в топі частотності саме в контексті вашого домену, а не «шкіряна куртка» з універсального словника Яндексу. SymSpell + N-gram LM дає зниження zero-result rate в 4-6 разів порівняно з ES fuzzy.
Як контекстна корекція покращує пошук?
SymSpell виправляє кожне слово незалежно. «кросівки адідас» виправить обидва слова правильно. Але «біліє кросівки» — SymSpell може запропонувати «білі» або «біліше», не знаючи, який варіант граматично коректний в контексті. N-gram language model на пошукових логах допомагає вибрати правильний варіант: P("білі кросівки") >> P("біліше кросівки").
Без контекстної моделі ви ризикуєте запропонувати користувачеві невірний варіант, який все одно не дасть результатів. На практиці це збільшує zero-result rate на 5-7%. У наших проектах ми використовуємо N-gram LM з вікном 3 токенів, навчену на логах конкретного додатку. Це дає приріст точності на 15-20%. Економія на операційній підтримці пошуку може досягати 2 000 000 грн на рік для додатків з високим трафіком.
Elasticsearch: spell correction з коробки та його обмеження
ES надає term suggester з fuzzy matching. Працює, але:
- шукає найближчі терміни з індексу за edit distance — не враховує контекст запиту
- слабо працює для коротких токенів (< 4 символів) через кількість варіантів з ed=1
- немає врахування частотності: «найки» (помилка) і «найки» (брендовий термін) отримують однаковий пріоритет
# ES term suggester — базовий рівень
response = await es.search(
index="products",
body={
"suggest": {
"spell_suggest": {
"text": query,
"term": {
"field": "title",
"suggest_mode": "missing", # тільки якщо термін не знайдено
"max_edits": 2,
"min_word_length": 4,
"string_distance": "jaro_winkler"
}
}
}
}
)
jaro_winkler краще підходить для коротких рядків, ніж levenshtein — він надає більшу вагу збігам на початку рядка.
Як ми це робимо: кейс з практики
Для клієнта — інтернет-магазину взуття з каталогом 50 000 товарів і 200 000 активних користувачів — ми впровадили зв'язку SymSpell + N-gram LM. Вихідний zero-result rate був 12%, після впровадження він знизився до 2.3%. Ключові кроки:
- Зібрали 2 млн пошукових запитів за 3 місяці, очистили від ботів.
- Побудували частотний словник та N-gram LM (триграми).
- Налаштували fallback: якщо SymSpell дає кілька варіантів, обираємо той, що максимізує ймовірність за LM.
- На клієнті додали UX-компонент з можливістю відкату до оригінального запиту.
Результат: користувачі приймають виправлення у 85% випадків, конверсія пошуку зросла на 9%, а операційні витрати на підтримку пошуку знизилися на 30%.
Деталі налаштування SymSpell для російської мови
Для побудови частотного словника ми використовуємо лише релевантні запити з логів, виключаючи ботів та тестові сесії. Мінімальна частота входження слова — 3. Для фонетичних помилок застосовуємо метафонний encoder, адаптований під кирилицю. Словник містить близько 200 000 унікальних слів.
Що входить в роботу
- Аналіз логів та побудова частотного словника на основі ваших даних
- Розробка та налаштування SymSpell + N-gram LM під специфіку вашого домену
- Інтеграція в search API (REST або GraphQL) з урахуванням поточної архітектури
- Мобільні компоненти (Android Compose, iOS SwiftUI) з UX-паттерном відкату
- Документація по експлуатації та моніторинг ключових метрик
- Код та доступи до репозиторію з CI/CD
- Підтримка протягом 1 місяця після деплою
Мобільна інтеграція: UX виправлення
// Android: відображення виправлення з можливістю скасування
@Composable
fun SearchResultsHeader(
originalQuery: String,
correctedQuery: String?,
onRevertToOriginal: () -> Unit
) {
if (correctedQuery != null && correctedQuery != originalQuery) {
Row(
modifier = Modifier.padding(horizontal = 16.dp, vertical = 8.dp),
verticalAlignment = Alignment.CenterVertically
) {
Text(
text = buildAnnotatedString {
append("Результати для: ")
withStyle(SpanStyle(fontWeight = FontWeight.Bold)) {
append(correctedQuery)
}
}
)
Spacer(modifier = Modifier.weight(1f))
TextButton(onClick = onRevertToOriginal) {
Text("Шукати «$originalQuery»")
}
}
}
}
Паттерн «ми виправили — але ви можете повернути оригінал» — стандарт індустрії. Не нав'язуйте виправлення без escape hatch.
// iOS: аналогічний підхід через SwiftUI
struct CorrectionNoticeView: View {
let original: String
let corrected: String
let onRevert: () -> Void
var body: some View {
HStack {
Text("Показуємо результати для «\(corrected)»")
.font(.subheadline)
Spacer()
Button("Шукати «\(original)»", action: onRevert)
.font(.subheadline)
}
.padding(.horizontal)
.padding(.vertical, 6)
.background(Color(.systemGray6))
}
}
Процес роботи та терміни
- Аналітика — збір та очищення пошукових логів, визначення частотності та типових помилок (1-2 дні).
- Проектування — вибір стеку (SymSpell, N-gram LM, fallback), налаштування словників (1-2 дні).
- Реалізація AI-виправлення помилок у пошуку мобільного додатку — інтеграція корекції в search API, написання клієнтських компонентів (iOS/Android) — 2-5 днів.
- Тестування — A/B тест на 10% трафіку, порівняння zero-result rate та метрик юзабіліті (2-3 дні).
- Деплой — поетапний rollout з моніторингом (1-2 дні).
Орієнтовні терміни: ES fuzzy + SymSpell з готовим словником — 2-4 дні; з кастомним словником та N-gram LM — 1-2 тижні. Детальний план складаємо після аудиту ваших даних. Замовте впровадження AI-виправлення помилок.
Як вибрати підходящий алгоритм?
Якщо трафік менше 100 запитів/сек і не критична точність — достатньо ES fuzzy. Для високих навантажень і вимог до якості обирайте SymSpell + N-gram LM. Нижче порівняльна таблиця ефективності різних підходів:
| Метрика | ES fuzzy тільки | SymSpell | SymSpell + N-gram LM |
|---|---|---|---|
| Zero-result rate | 8-12% | 4-6% | 2-3% |
| Час відповіді (p95) | < 20 мс | < 5 мс | < 10 мс |
| Частка прийнятих виправлень | 50-60% | 70-80% | 80-90% |
| Складність впровадження | Низька | Середня | Висока |
Ми допоможемо визначитися: зв'яжіться з нами для безкоштовної оцінки вашого проекту. Досвід нашої команди — понад 30 успішних інтеграцій пошукових систем у мобільних додатках. Ми гарантуємо зниження zero-result rate до 3% або повертаємо кошти.
Згідно з Human Interface Guidelines від Apple, пошук повинен бути стійким до помилок і пропонувати релевантні результати (розділ «Search»).







