Реалізація автоматичного зіставлення (мапінгу) товарів з каталогом постачальника
Власник інтернет-магазину отримав прайс-лист від постачальника на 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 разів порівняно з ручним мапінгом. Зв'яжіться з нами, щоб обговорити інтеграцію з вашим постачальником. Замовте впровадження автоматичного мапінгу прямо зараз.







