Реалізація AI-автодоповнення пошукових запитів у мобільному додатку

TRUETECH займається розробкою, підтримкою та обслуговуванням мобільних додатків iOS, Android, PWA. Маємо великий досвід та експертизу для публікації мобільних додатків до популярних маркетів Google Play, App Store, Amazon, AppGallery та інші.

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1735 послуг
Реалізація AI-автодоповнення пошукових запитів у мобільному додатку
Середній
~3-5 днів
Часті запитання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_mobile-applications_feedme_467_0.webp
    Розробка мобільного додатка для компанії FEEDME
    792
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    671
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1097
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    969
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    914
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    495

Реалізація AI-автодповнення пошукових запитів в мобільному додатку

Автодповнення — одна з найвимоглівіших до latency функцій мобільного додатка. Користувач очікує підказки швидше, ніж встигне їх помітити: ідеал — < 100 мс від введення символу до появи варіантів. При цьому запити повинні бути релевантними, а не просто «популярними».

Чому простий prefix-пошук не працює

Наївна реалізація — зберігати частові запити в словнику та шукати за префіксом. Це працює для «nike» → «nike кросівки», але ломиться для:

  • орфографічних помилок: «найк» замість «nike»
  • транслітерації: «krossovki» vs «кроссовки»
  • семантично близьких запитів: «беговая обувь» при введенні «крос»
  • персоналізації: однаковий запит «платье» для різних користувачів повинен давати різні топ-підказки

Архітектура production-ready автодповнення

Trie + нечіткий пошук для швидкості

Базовий шар — Trie на популярних запитах з нечітким пошуком через BK-tree або Symmetric Delete. Elasticsearch з маппінгом completion field — готове рішення з fuzzy matching з коробки:

{
  "mappings": {
    "properties": {
      "suggest": {
        "type": "completion",
        "analyzer": "standard",
        "contexts": [
          {"name": "category", "type": "category"}
        ]
      },
      "weight": {"type": "integer"}
    }
  }
}
# Пошук автодповнень через ES Completion Suggester
async def get_suggestions(prefix: str, category: str, user_id: str) -> list[str]:
    response = await es.search(
        index="search_suggestions",
        body={
            "suggest": {
                "query_suggest": {
                    "prefix": prefix,
                    "completion": {
                        "field": "suggest",
                        "size": 8,
                        "fuzzy": {"fuzziness": "AUTO"},
                        "contexts": {"category": [category]}
                    }
                }
            }
        }
    )
    return [hit["_source"]["query"] for hit in response["suggest"]["query_suggest"][0]["options"]]

Персоналізований рейтингувач підказок

Базові підказки з ES переранжуються з урахуванням історії користувача. Ознаки рейтингувача:

  • global_frequency — скільки разів цей запит вводили всі користувачі
  • user_query_history_match — вводив ли цей користувач подібний запит раніше
  • user_category_affinity — наскільки категорія запиту близька інтересам користувача
  • recency_boost — трендові запити за останні 24 години отримують буст

On-device кеш для миттєвого відклику

Перші 3–5 символів запиту охоплюють ~80% популярних prefix-комбінацій. Кешуємо підказки для них на пристрої при старті додатка (або у фоні):

// Android: попередня завантаження популярних prefix-підказок
class AutocompleteCache(context: Context) {
    private val db = Room.databaseBuilder(context, AutocompleteDatabase::class.java, "autocomplete").build()

    suspend fun preload() {
        val popularPrefixes = autocompleteApi.getPopularPrefixes(limit = 500)
        db.suggestionDao().insertAll(popularPrefixes)
    }

    suspend fun getSuggestions(prefix: String): List<String> {
        // спочатку перевіряємо локальний кеш
        val cached = db.suggestionDao().getSuggestions(prefix)
        if (cached.isNotEmpty()) return cached

        // якщо немає в кеші — запрос на сервер
        return autocompleteApi.getSuggestions(prefix)
    }
}

Debounce та cancellation на клієнті

Кожний символ не повинен тригерити новий запрос. Debounce 150–200 мс + скасування попереднього in-flight запиту:

// iOS: debounced автодповнення з cancellation
class SearchViewModel: ObservableObject {
    @Published var suggestions: [String] = []
    private var searchTask: Task<Void, Never>?

    func onQueryChanged(_ query: String) {
        searchTask?.cancel()
        guard query.count >= 2 else { suggestions = []; return }

        searchTask = Task {
            try? await Task.sleep(nanoseconds: 150_000_000)  // 150ms debounce
            guard !Task.isCancelled else { return }

            let results = try? await autocompleteService.getSuggestions(query)
            await MainActor.run {
                suggestions = results ?? []
            }
        }
    }
}

Task.isCancelled перевіряється після debounce — якщо користувач продовжив введення, попередня задача вже скасована.

Логування вибору підказки

Коли користувач тапає на підказку, логуємо: позицію у списку, prefix при якому вона була вибрана, фінальний запит. Ці дані — навчальна вибірка для наступної версії рейтингувача.

Процес роботи

Аналіз пошукових логів: топ-1000 запитів, паттерни опечаток, мова/транслітерація.

Настройка Elasticsearch Completion Suggester з fuzzy matching.

Розробка персоналізованого рейтингувача підказок.

Реалізація on-device кеша + debounce логіки на iOS/Android.

Орієнтири за часом

ES Completion Suggester без персоналізації — 2–3 дні. З персоналізованим рейтингувачем та on-device кешем — 1,5–2 тижні.