# 🧠 Рекомендательные стратегии в Gravity Field

Рекомендательные стратегии управляют логикой того, какие товары будут показаны пользователю в персонализированных блоках: на страницах товара, категорий, корзины и т.д.

Стратегия — это связка рекомендательного алгоритма, фильтров и дополнительных правил, с помощью которых можно управлять выдачей товаров.


# 🎯 Зачем нужны стратегии?

  • Использовать алгоритмы персонализации: например, показать похожие товары или товары, купленные вместе.
  • Управлять показом: исключить просмотренные, закрепить промо-позиции, отфильтровать по бренду или категории.
  • Делать контент персональным: разные стратегии для разных аудиторий.
  • Гарантировать отображение: fallback обеспечит показ, даже если основной алгоритм не дал результат (логика fallback фиксирована и не настраивается).

# ⚙️ Как создать стратегию

  1. Перейдите в раздел Assets → Strategies
  2. Нажмите Создать стратегию
  3. Укажите:
    • Название и описание
    • Тип страницы (Product / Category / Cart и т.д.)
    • Алгоритм (или разные алгоритмы для каждого слота) 📎 Подробнее: Описание алгоритмов
    • Предустановленные и/или кастомные фильтры
  4. Нажмите Сохранить

💡 Одна стратегия может использоваться в нескольких кампаниях и виджетах.

🔄 Перемешивание (Shuffle): можно включить перемешивание выдачи, чтобы каждый пользователь видел разный порядок товаров.


# 🧠 Algorithm per slot

Можно задать разные алгоритмы для разных позиций в выдаче.

Например:

  • Слот 1: Recently Viewed
  • Слот 2–3: Affinity
  • Слот 4: Popularity

📌 Это удобно, чтобы комбинировать потребности пользователя (например, напомнить о просмотренном) и бизнес-задачи (продвигать популярное).

Ограничения:

  • В пользовательских правилах (фильтрах) доступны только Pin, если используются разные алгоритмы в слотах.

# 🔀 Shuffle (перемешивание товаров)

В любой стратегии можно включить перемешивание товаров — это позволяет показывать пользователю разный набор SKU при каждом просмотре страницы, даже если он входит в одну и ту же аудиторию.

По умолчанию товары показываются строго по порядку, в соответствии с рейтингом алгоритма.

# Как это работает

  • При включенном shuffle, система запрашивает в 4 раза больше товаров, чем нужно для виджета.
  • Из них случайным образом выбирается подмножество для показа.
  • Например, если в блоке 4 слота — мы выбираем 4 случайных товара из топ-16.

💡 Это работает для всех алгоритмов, включая fallback.

# Особенности:

  • Shuffle применяется отдельно внутри каждого алгоритма.
    • Если сработал fallback — в нём тоже будет выполнено перемешивание независимо.
  • Pinned-позиции не перемешиваются — закреплённые товары остаются в своих слотах.
  • Перемешивание никак не влияет на работу фильтров и fallback-цепочек.

📌 Перемешивание особенно полезно при большом объёме трафика или если вы хотите избежать "замыливания" одного и того же набора рекомендаций.

# 🧰 Предустановленные фильтры

Фильтры бывают двух типов:

  • На основе поведения пользователя
  • На основе контекста страницы
Фильтр Назначение
Exclude recently viewed items Исключить недавно просмотренные (до 25 товаров)
Exclude recently purchased items Исключить недавно купленные (до 100 товаров)
Only include items that match the viewed item category Показывать только товары из категории текущей страницы или товара
Only include items that match the viewed item properties Включить товары, совпадающие по атрибутам (бренд, цвет и т.п.) что и текущий товар
Exclude items that match the viewed item properties Исключить товары по тем же атрибутам (бренд, цвет и т.п.) что и текущий товар
Only include items that match search query Включить товары совпадающие по атрибутам (бренд, цвет и т.п.) к поисковому запросу

# 🧩 Фильтрация по категории

Фильтры по категории позволяют ограничить выдачу товарами из той же категории, что и текущий товар или страница.

Варианты:

  • Полное совпадение категории — товары из точно такой же категории (вся иерархия).
  • Родительская категория — товары из более широких категорий (родительских уровней).

Пример:

  • Просматриваемая категория: Men → Shoes → Sneakers
  • При включённом фильтре Родительская категория, в выдачу попадут:
    • Men → Shoes → X
    • Men → Shoes → Y
    • А если ничего не найдено — включается fallback на другой алгоритм

⚠️ Родительская категория не ослабляется. Даже при недостатке товаров она сохраняется как обязательное условие.


# 🧩 Фильтрация по свойствам товара

Фильтры по свойствам позволяют включать или исключать товары, совпадающие по атрибутам текущего товара.

Примеры полей:

  • Бренд (Brand)
  • Цвет (Color)
  • Пол (Gender)
  • Ключевые слова (Keywords)

Пример логики ослабления:

  • Установлены фильтры: Brand | Color | Gender
  • Если не хватает товаров:
    • Сначала убирается Gender
    • Затем Color
    • Остаётся только Brand, как несбрасываемое условие

⚠️ В логике ослабления первый указанный атрибут не ослабляется, остальные могут быть сняты последовательно, если система не находит нужное количество товаров.

Пример:

  • Фильтр по: Material | Pattern | Size
  • Если нет достаточного количества товаров, система оставит только Material

# ℹ️ Ослабление фильтров

Предустановленные фильтры позволяют гибко управлять выдачей — но не все фильтры ведут себя одинаково. Некоторые из них ослабляются, если система не находит нужное количество товаров. Это важно для полноты выдачи в виджетах.

  • Сначала убирается последний фильтр
  • Если всё ещё недостаточно товаров — следующий и т.д.
  • Первый фильтр не ослабляется

Если после ослабления всё ещё недостаточно товаров — включается fallback-алгоритм.

📌 Важно: Первый атрибут в фильтре никогда не ослабляется, даже если это приведёт к пустым слотам.

# Пример:

Допустим, вы настроили фильтр на выдачу товаров, совпадающих по следующим атрибутам:

  • Категория: Men > Shoes > Sneakers
  • Атрибуты товара: Brand, Color, Gender

🔁 При недостатке подходящих товаров:

  1. Сначала ослабляется Gender, затем Color;
  2. Затем Sneakers, потом Shoes;
  3. Останутся только: Brand, Men.

Таким образом система стремится сохранить ключевые параметры, и всё ещё вернуть как можно более релевантную рекомендацию.

Рекомендуется: Располагая фильтры, всегда ставьте самые важные атрибуты первыми — они будут зафиксированы.

# 🔍 Фильтры по поисковому запросу

Доступно только на странице поиска.

Фильтр позволяет отображать только те товары, в которых содержится поисковая строка пользователя. Поиск осуществляется по полю, указанному в настройках фильтра, и работает по принципу “содержит”.

⚠️ Убедитесь, что выбранное поле присутствует в продуктовом фиде, и поддерживает текстовый поиск.

Пример использования:

  • Пользователь ищет "кроссовки"
  • В фиде есть поле product_name
  • Фильтр отбирает товары, у которых значение поля product_name содержит "кроссовки"

# 🧠 Фильтры на основе поведения пользователя

Фильтры поведения пользователей позволяют исключить из выдачи товары, которые пользователь уже просматривал или покупал — как онлайн, так и офлайн.

Фильтр Назначение
Исключить просмотренные Исключает до 25 последних просмотренных товаров
Исключить купленные Исключает до 100 последних купленных товаров

Логика работы фильтра:

  • ️Фильтры не ослабляются.
  • Если не найдено подходящих товаров после применения фильтра — в виджете могут остаться пустые слоты.

# 📦 Fallback: что происходит, если не хватает товаров

Fallback включается автоматически и не настраивается вручную.

Пример fallback-цепочек:

Исходный алгоритм Цепочка fallback
Affinity → Viewed with Recently Viewed → Popularity
Similarity → Viewed Together → Popularity
Purchased Together → Viewed Together → Similarity → Popularity
Viewed Together → Similarity → Popularity

Подробнее


# ⚙️ Пользовательские фильтры (Custom Rules)

Пользовательские фильтры позволяют настраивать выдачу товаров по любым полям из продуктового фида. Это даёт максимальную гибкость при управлении логикой стратегий.

# 🎯 Что можно настроить:

  • Фильтры по любому полю фида: brand, color, material, is_sale, custom_tag и т.д.
  • Три типа правил:
    • Include — включить товары с заданными условиями
    • Exclude — исключить товары с заданными условиями
    • Pin — закрепить конкретный товар в определённой позиции

# 📌 Закрепление товаров (Pin)

Позволяет вручную закрепить товар в конкретном слоте. Подходит для:

  • Продвижения промо-позиций
  • Ручного размещения конкретных SKU

В слотах с Pin алгоритм не применяется.

# 🧩 Применение к слотам

  • Фильтр можно применить ко всем слотам стратегии или только к выбранным.
  • Если фильтр применяется только к одному слоту — он влияет только на него.
  • Один слот может иметь несколько условий фильтрации.

# 🔍 Работа условий

Поле price — единственное, которое воспринимается системой как число. Это позволяет задавать диапазоны цен в фильтрах.

📢 Если вы хотите задать диапазон, используйте И:

"Цена больше чем A и меньше чем B" —
"Цена больше чем A или меньше чем B" —

# Условия для поля price:

  • equal
  • more than
  • at least
  • less than
  • at most

# Условия для остальных полей (строковые значения):

  • is
  • is not
  • contains
  • empty
  • is not empty

# 💡 Особенности:

  • Поддерживаются только поля, присутствующие в фиде.
  • Можно указать до 30 фильтров на одну стратегию.
  • Для числовых значений (например, price) доступны сравнения по диапазонам.
  • Условия внутри фильтра работают по логике AND, между фильтрами — OR.
  • Пользовательские фильтры (в отличие от предустановленных) не ослабляются — они применяются строго.
  • Фильтры с типом contains работают только с начала строки и могут повлиять на производительность.
  • Если в Pin указан SKU товара, то:
    • Система попытается получить этот товар напрямую из товарного фида, если он там есть;
    • Если указано несколько SKU:
      • Сначала система проверяет, вернула ли стратегия один из этих SKU — если да, берётся он;
      • Если стратегия ничего не вернула, система выберет один из указанных SKU на основе Affinity-профиля пользователя.
  • Include / Exclude фильтры по слотам:
    • Сначала проверяются товары, полученные из стратегии;
    • Если ни один не подходит — система ищет в товарном фиде (с учётом всех фильтров, но без ослабления);
    • Найденные товары сортируются по популярности;
    • Только если товар удовлетворяет фильтрам, он попадает в слот.

📌 Это важно учитывать при построении сложной логики фильтрации, особенно если вы работаете с пинами или настраиваете индивидуальные правила под каждый слот.


# 🧠 Динамические фильтры

Для более гибкой логики фильтрации используйте динамические фильтры.

Они позволяют:

  • исключить товары, сильно отличающиеся по цене
  • фильтровать по признаку, совпадающему с товаром на странице
  • адаптировать рекомендации под поведение или контекст
  • учитывать значения, рассчитанные в момент визита пользователя (например, сколько осталось до бесплатной доставки)
  • исключить товары дешевле суммы, недостающей до бесплатной доставки
  • подобрать товары из нужного региона или сезона
  • применить сегментные правила в реальном времени

# Как использовать:

  • В frontend-кампаниях — через JS-функции внутри вариации
  • В API-кампаниях — через selector.args.recs_campaign.realtimeRules в choose-запросах
  • В интерфейсе стратегии — через Real-time Rules

# 📌 Вариант 1: JS-функция внутри вариации

Пример front-end функции, с помощью которой можно исключить из финальной выдачи товары, отличающиеся по цене на 50% от изначального:

function getRules() {
  const rules = [];
  const currentPrice = getCurrentPrice();
  if (!currentPrice) return rules;

  const gte = currentPrice*0.5;
  const lte = currentPrice*1.5;

  rules.push({
    id: 1,
    type: 'include',
    slots: [],
    query: {
      conditions: [
        {
          field: 'price',
          arguments: [
            {
              action: 'less_or_equal',
              value: [lte],
            },
          ],
        },
        {
          field: 'price',
          arguments: [
            {
              action: 'more_or_equal',
              value: [gte],
            },
          ],
        },
      ],
    },
  });
  return rules;
}

📌 Подобные фильтры можно адаптировать под любой атрибут товара — от цены до категорий или флагов on_sale.


# Вариант 2: Real-time Rules в интерфейсе

Теперь вы можете задать динамический фильтр на основе эвалюатора прямо в интерфейсе стратегии, без кода.

# Как это работает:

  • Эвалюатор (Evaluator) рассчитывает нужное значение в момент попадания пользователя в сценарий
  • Это значение можно использовать как аргумент для фильтрации

# Как настроить:

  1. При редактировании стратегии, в секции Custom Rules нажмите Новое правило
  2. Выберите нужное поле фида (например, price)
  3. Отметьте чекбокс Use real-time rules
  4. В выпадающем списке выберите нужный эвалюатор
  5. Укажите условие фильтрации (>=, equal, contains и т.д.)

💡 Эвалюаторы настраиваются в разделе Assets → Evaluators, Подробнее

# 🧬 Что такое group_id?

group_id объединяет варианты одного товара — например, майка разных размеров. Алгоритмы работают с группами товаров, а не отдельными SKU.

  • Алгоритм выбирает один товар из группы
  • Это исключает дублирование одинаковых позиций в виджете
  • Для Recently purchased и Recently viewed выдаются все SKU, которые пользователь смотрел или покупал.

# FAQ

Могу ли я показать товары из той же категории, что и текущий товар?
→ Да, используйте фильтр Include same category. Он доступен как предустановленный фильтр, так и в пользовательских правилах.

Как работает fallback?
→ В случае недостатка товаров:

  1. Сначала система ослабляет фильтры (если они допускают ослабление),
  2. Если этого недостаточно — включается fallback на другой алгоритм (по фиксированной логике, изменить её нельзя).

Применяются ли фильтры к fallback-алгоритмам?
→ Да. Все фильтры и правила (включая Pin, Include и Exclude) продолжают действовать на fallback-алгоритмы.

Почему в блоке дублируются похожие товары?
→ Если в фиде не указан group_id, система не сможет объединить похожие товары (например, одну модель в разных цветах). При корректно настроенном group_id дубли исключаются — отображается только один товар из группы.

Будет ли исключение дублей, если на странице несколько виджетов?
→ Да. Gravity Field автоматически исключает одинаковые товары между виджетами, если они размещены на одной странице и используются кампании типа Recommendations.

Хочу закрепить товар в первом слоте — как это сделать?
→ Используйте правило Pin, укажите нужный SKU и слот. Если товара нет в выдаче, он будет подтянут из фида или выбран по Affinity-профилю (если указано несколько SKU).

Могу ли я задать фильтр только для одного слота?
→ Да. Пользовательские фильтры можно применять как ко всей стратегии, так и к конкретным слотам.

Возвращаются ли только товары в наличии?

  • Да, по умолчанию все стратегии, кроме Recently Viewed, Recently Purchased и Last Purchase, возвращают только товары с in_stock: true, если это поле есть в фиде.
  • Стратегии, основанные на истории, могут вернуть товары вне наличия.

Можно ли комбинировать алгоритмы в одной стратегии?
→ Да, с помощью Algorithm per slot можно задать разные алгоритмы для каждого слота. В этом случае доступны только правила Pin.

Как задать диапазон цен в фильтре?
→ Используйте два условия:

  • Цена > A и Цена < B
    Важно: не используйте ИЛИ, это приведёт к некорректной фильтрации.

Что будет, если ни один товар не подходит под фильтры?
→ Система начнёт ослаблять фильтры (если это допускается), затем применит fallback-алгоритм. Если ни один товар не найден — слот останется пустым.

Есть ли ограничения на количество фильтров в стратегии?
→ Да. Максимум можно задать до 30 пользовательских фильтров в одной стратегии.

Что происходит, если указать несколько SKU в Pin?
→ Сначала система ищет эти SKU в выдаче стратегии. Если ни один не найден, система выберет наиболее релевантный на основе Affinity-профиля пользователя.

Могу ли я использовать фильтры без алгоритма?
→ Да. Можно создать стратегию без алгоритма (Empty strategy) и управлять выдачей только через правила Pin, Include, Exclude.

Есть ли фильтр по поисковому запросу?
→ Да, на странице поиска можно отфильтровать товары по совпадению с поисковым запросом пользователя в указанном текстовом поле из фида.


# 📎 См. также