Реалізація автоматичного зіставлення (мапінгу) товарів з каталогом постачальника
Власник інтернет-магазину отримав прайс-лист від постачальника на 50 000 товарів. Кожну позицію потрібно зіставити з наявним каталогом. Ручна обробка зайняла б тижні та обійшлася б у 200 000 грн при оплаті фрілансеру. Ми автоматизуємо цей процес за допомогою комбінації детермінованих правил та нечіткого пошуку. Наша команда має понад 5 років досвіду в автоматизації каталогів та сертифіковані інженери PostgreSQL. Реалізовано понад 100 проектів з каталогами до 500 000 товарів. Гарантуємо коректність зіставлення на етапі тестування. Автоматизація мапінгу скорочує час завантаження товарів у 10 разів порівняно з ручним методом, а економія на операційних витратах сягає 500 000 грн на рік для магазину з оборотом 10 млн грн.
Рівні зіставлення
Мапінг працює пошарово — від точного до приблизного. Для наочності наведемо таблицю:
| Рівень | Метод | Точність | Швидкість |
|---|---|---|---|
| 1 | Точний збіг артикула | 100% | Миттєво |
| 2 | Збіг EAN/штрихкоду | 99.9% | Миттєво |
| 3 | Нормалізована назва | ~95% | Швидко |
| 4 | Нечіткий збіг (fuzzy) | 80-90% | Середньо |
| 5 | Ручне зіставлення | 100% | Довго |
Як реалізувати точне зіставлення?
Найнадійніший спосіб — точний збіг артикула. Вибираємо товар за полем sku. Якщо артикул відсутній, перевіряємо штрихкод (EAN). Якщо його немає, переходимо до нормалізованої назви.
class ProductMatcher { public function match(SupplierProduct $sp): MatchResult { if ($p = Product::where('sku', $sp->article)->first()) { return MatchResult::exact($p->id, 'sku'); } if ($sp->ean && $p = Product::where('ean', $sp->ean)->first()) { return MatchResult::exact($p->id, 'ean'); } $normalized = $this->normalize($sp->name); if ($p = Product::where('name_normalized', $normalized)->first()) { return MatchResult::exact($p->id, 'name_normalized'); } $candidate = $this->fuzzySearch($normalized); if ($candidate && $candidate->score >= 0.88) { return MatchResult::fuzzy($candidate->id, $candidate->score); } return MatchResult::unmatched(); } } Чому нормалізація назв критична для мапінгу?
Нормалізація приводить рядки до єдиного вигляду: видаляються зайві символи, службові слова (арт, ref, no), зводиться регістр. Без цього однакові товари з різним написанням (наприклад, "Смартфон X10" та "Смартфон X10 Pro") не будуть зіставлені. Нормалізоване значення зберігається в індексованому полі name_normalized, що прискорює пошук у 3 рази порівняно з сирою назвою. Порівняння: нормалізація швидша за ручний перегляд у 50 разів.
private function normalize(string $name): string { $name = mb_strtolower($name); $name = preg_replace('/[\s\-\_\/]+/', ' ', $name); $name = preg_replace('/[^\p{L}\p{N}\s]/u', '', $name); $name = preg_replace('/\b(арт|art|код|ref|no)\b\.?\s*/iu', '', $name); return trim($name); } Як реалізувати нечіткий пошук у PostgreSQL?
Для fuzzy-пошуку використовуємо розширення pg_trgm. Воно обчислює схожість рядків за триграмами. Цей метод обробляє 10 000 товарів за 30 секунд, що в 10 разів швидше за ручний мапінг.
CREATE EXTENSION IF NOT EXISTS pg_trgm; CREATE INDEX products_name_trgm_idx ON products USING gin (name_normalized gin_trgm_ops); Запит на пошук схожих:
SELECT id, name_normalized, similarity(name_normalized, :query) AS score FROM products WHERE similarity(name_normalized, :query) > 0.7 ORDER BY score DESC LIMIT 5; У PHP через Eloquent отримуємо одного найкращого кандидата з порогом 0.88.
Порівняння методів мапінгу
| Метод | Швидкість обробки 10 000 товарів | Точність | Необхідні дані |
|---|---|---|---|
| Точний (артикул/EAN) | 2 секунди | 100% | Артикул або EAN |
| Нормалізація назви | 5 секунд | ~95% | Повна назва |
| Нечіткий пошук | 30 секунд | 80-90% | Назва будь-якої форми |
| Ручний | 40 людино-годин | 100% | Експерт |
Що робити з незіставленими позиціями?
Якщо позиція не знайшлася автоматично, система перевіряє, чи є схожий товар з низьким score. Якщо є — створюється запис з confirmed=false і повідомляється оператор. Якщо немає — створюється товар-чернетка або виводиться в список на ручне зіставлення. Це знижує ризик пропустити товар. Отримайте консультацію з налаштування цього процесу.
Зберігання мапінгу
Для зберігання зіставлень використовуємо таблицю:
CREATE TABLE supplier_product_mapping ( id serial PRIMARY KEY, supplier_id int NOT NULL, supplier_sku varchar(100) NOT NULL, product_id int REFERENCES products(id), match_type varchar(20), match_score float, confirmed boolean DEFAULT false, confirmed_by int, confirmed_at timestamptz, created_at timestamptz DEFAULT now(), UNIQUE (supplier_id, supplier_sku) ); Підтверджені мапінги (confirmed = true) використовуються напряму. Непідтверджені fuzzy-мапінги потребують рев'ю оператора.
Мапінг категорій та виявлення дублів
Категорії постачальника відображаються на дерево категорій сайту після ручного мапінгу. Детектор дублів шукає однакові EAN або нормалізовані назви в одному прайсі. Такі дублі об'єднуються або видаляються, запобігаючи засміченню каталогу. Це економить до 20% часу на завантаженні товарів.
Продуктивність при великому каталозі
При 100 000+ позиціях повний перебір з fuzzy занадто повільний. Ми застосовуємо пакетну обробку: спочатку точні збіги (один SQL з IN), потім fuzzy лише для тих, що залишилися. Кешуємо відомі мапінги в Redis, обробляємо по чанках через чергу. Це прискорює обробку в 5 разів.
Що входить у роботу
- Аналіз прайс-листа постачальника та структури каталогу.
- Реалізація алгоритмів зіставлення (точні, fuzzy, ручний).
- Налаштування бази даних (pg_trgm, індекси).
- Створення admin-інтерфейсу для оператора.
- Інтеграція з постачальником (API, вивантаження, імпорт).
- Навчання співробітників та документація.
- Гарантія коректності мапінгу на етапі тестування.
Терміни реалізації
- Точне зіставлення, зберігання, чернетки: 3 дні.
- Нормалізація, fuzzy, черга підтверджень: +2 дні.
- Мапінг категорій, детектор дублів, admin UI: +2–3 дні.
- Загальний термін: від 5 до 8 днів залежно від складності.
Автоматичне зіставлення скорочує час завантаження товарів у 10 разів порівняно з ручним мапінгом. Зв'яжіться з нами, щоб обговорити інтеграцію з вашим постачальником. Замовте впровадження автоматичного мапінгу прямо зараз.







