Поставщики называют одни и те же характеристики по-разному: «цвет», «Цвет изделия», «color», «Colour», «RAL». На сайте — один фильтр «Цвет». Ручное приведение характеристик от десятков поставщиков к фильтрам сайта — это сотни часов работы, которые нужно автоматизировать. Мы разрабатываем систему маппинга под ключ: вы загружаете прайсы, а мы настраиваем словари, алгоритмы нормализации и интеграцию с фасетным поиском. Экономия бюджета на каждом поставщике — от 30 000 рублей в год. Время обработки одного поставщика сокращается с 40 часов до 2–3 часов, что в 10–20 раз быстрее. При 20 поставщиках вы экономите более 700 часов в год, которые можно направить на развитие каталога. Используем PostgreSQL с расширением pg_trgm для нечёткого поиска и очереди для нераспознанных значений. Свяжитесь с нами — мы продемонстрируем систему на ваших данных.
Архитектура системы маппинга
Три уровня абстракции:
Характеристика поставщика → Атрибут сайта → Значение фильтра "Цвет изделия: Красный" → color → "Красный" "color: Red" → color → "Красный" (с нормализацией значения) "RAL 3020" → color → "Красный" (через справочник RAL) Таблицы маппинга — attribute_name_mapping (имя атрибута) и attribute_value_mapping (значение). Обе поддерживают приоритет: сначала маппинг для конкретного поставщика, потом универсальный. Это позволяет настраивать исключения для отдельных поставщиков. Таблица product_filter_values хранит денормализованные данные с индексами, обеспечивая быструю фасетную фильтрацию. При изменении маппинга данные пересчитываются через artisan-команду.
Алгоритм маппинга
Основной класс AttributeMapper выполняет два шага:
- Определяет внутренний ключ атрибута (
color,spec_weight_kg) по имени от поставщика. - Подбирает нормализованное значение — либо из словаря, либо через автонормализатор.
class AttributeMapper { public function mapAttribute( string $supplierName, string $supplierValue, ?int $supplierId = null ): ?MappedAttribute { // Шаг 1: найти маппинг имени атрибута $siteAttribute = $this->resolveAttributeName($supplierName, $supplierId); if (!$siteAttribute) { $this->logUnknownAttribute($supplierName, $supplierId); return null; } // Шаг 2: найти маппинг значения $siteValue = $this->resolveAttributeValue($siteAttribute, $supplierValue, $supplierId); if (!$siteValue) { // Пробуем нормализовать без маппинга $siteValue = $this->autoNormalizeValue($siteAttribute, $supplierValue); } return new MappedAttribute($siteAttribute, $siteValue); } private function resolveAttributeName(string $name, ?int $supplierId): ?string { $normalized = mb_strtolower(trim($name)); // Сначала специфичный маппинг для поставщика if ($supplierId) { $mapping = AttributeNameMapping::where([ 'supplier_id' => $supplierId, 'supplier_name' => $normalized, ])->value('site_attribute'); if ($mapping) return $mapping; } // Затем универсальный return AttributeNameMapping::whereNull('supplier_id') ->where('supplier_name', $normalized) ->value('site_attribute'); } } Как автоматически нормализуются значения?
Числовые характеристики (вес, габариты, напряжение) нормализуются без словарей: «2,5 кг» → 2.5, «1000 г» → 1.0. Строковые значения обычно приводятся к нижнему регистру или к первому заглавному (если это не название бренда). Для цветов используется справочник RAL — его мы интегрируем на этапе настройки.
private function autoNormalizeValue(string $attribute, string $raw): string { return match ($attribute) { 'spec_weight_kg' => $this->parseWeight($raw), 'spec_dimensions' => $this->parseDimensions($raw), 'spec_voltage' => $this->parseVoltage($raw), default => $this->capitalizeFirst($raw), }; } private function parseWeight(string $raw): string { // "2,5 кг" | "2500 г" | "2.5kg" → "2.5" if (preg_match('/(\d+[.,]\d+|\d+)\s*г(?:рамм)?/iu', $raw, $m)) { return (string) (((float) str_replace(',', '.', $m[1])) / 1000); } if (preg_match('/(\d+[.,]\d+|\d+)\s*кг/iu', $raw, $m)) { return str_replace(',', '.', $m[1]); } return $raw; } | Исходное значение | Атрибут | Результат |
|---|---|---|
| 2,5 кг | spec_weight_kg | 2.5 |
| 2500 г | spec_weight_kg | 2.5 |
| Red | color | красный |
| RAL 3020 | color | Красный |
Пример маппинга для поставщика "ТехноКом"
- Исходные данные: "Цвет: Red", "Вес: 2.5 kg"
- Маппинг: "Цвет" -> color, "Red" -> Красный; "Вес" -> spec_weight_kg, "2.5 kg" -> 2.5
- Результат: товар отображается в фильтре "Цвет: Красный" и "Вес: 2.5"
Почему fuzzy-поиск важен для новых значений?
Отметим: когда в прайсе появляется «Красн.», а в словаре только «Красный», система предлагает оператору создать маппинг на основе схожести строк. Используем функцию similarity из модуля pg_trgm. При пороге >0.6 показываем варианты. Оператор одним кликом подтверждает — и на следующий импорт значение уже маппится автоматически. Это избавляет от ручного поиска по каталогу.
Что входит в работу?
- Проектирование структуры таблиц маппинга и нормализации.
- Разработка алгоритмов (словарный маппинг, автонормализация, fuzzy-поиск).
- Интеграция с фасетным поиском: запись значений в
product_filter_valuesи настройка индексов. - Административный интерфейс для управления маппингом и очередью нераспознанных атрибутов.
- Документация по расширению словарей и нормализаторов.
- Обучение операторов работе с системой.
Сроки реализации
| Этап | Сроки |
|---|---|
| Базовый маппинг имён атрибутов + запись в фильтры | 3 дня |
| Автонормализация числовых значений | +1 день |
| Fuzzy-предложения + очередь нераспознанных + admin UI | +2–3 дня |
| Полная интеграция с фасетным поиском и пересчёт при изменении маппинга | +1–2 дня |
Итоговый срок — от 3 до 9 дней в зависимости от количества поставщиков и сложности справочников. Стоимость базового внедрения — от 15 000 рублей, полный проект — от 50 000 рублей. Получите консультацию: мы оценим ваш проект за один день. Закажите демонстрацию на ваших данных — оцените экономию.
Типичные ошибки при маппинге
- Игнорирование контекста поставщика. Если один поставщик называет «длина» габарит, а другой — характеристику, то универсальный маппинг сломает фильтрацию. Всегда используем supplier_id.
- Отсутствие нормализации единиц. Смешивание кг и граммов в одном фильтре делает его бесполезным. Мы настраиваем автонормализацию под ваш ассортимент.
- Забывают про новые значения. Без очереди нераспознанных атрибутов вы будете терять товары из фильтрации. Наша система накапливает статистику и подсвечивает частые пропуски.
- Отсутствие пересчёта фильтров при изменении маппинга. Если не обновлять
product_filter_values, поиск будет выдавать некорректные результаты. Мы автоматизируем пересчёт при каждом изменении.
Свяжитесь с нами — покажем, как система работает на ваших данных, и вы убедитесь в её эффективности. Гарантируем результат.







