← На главную

Интеграция поиска без флага fullData

Метод серверной интеграции, при котором Search API возвращает идентификаторы и скоринг, а данные товаров подтягиваются из собственной базы или кеша платформы.

📖
Обзор метода

Метод предполагает, что Search API возвращает только идентификаторы товаров (id) и минимальные служебные атрибуты. Все отображаемые данные — название, цена, изображение, ссылка — подтягиваются из собственной базы данных или кеша платформы по полученным ID.

Это рекомендуемый метод для production-интеграции: он быстрее, снижает нагрузку на API и даёт полный контроль над отображаемыми данными.

🔀
Когда использовать
СценарийfullData=falsefullData=true
Production-интеграция✅ рекомендуется
Быстрый прототип / MVP
Есть собственная БД товаров
Нет доступа к БД на бэкенде
Нужна скорость ответа
Лимит на размер выдачидо 2000 товаровдо 400 товаров
🏗️
Архитектура запроса

Схема показывает полный путь запроса — от браузера до объединённого ответа фронтенду. Блок Autocomplete API участвует только если на проекте интегрированы автоподсказки.

🖥 Браузер пользователя пользователь вводит запрос ввод: «кросовки» 🔍 Autocomplete API autocomplete.diginetica.net → возвращает correction correction = «кроссовки» ⚙️ Ваш бэкенд (прокси / SSR) передаёт correction как st= в Search API st=correction Search API sort.diginetica.net/search [id, score] ids → запрос к БД 🗄 Ваша БД / кеш getProductsByIds(ids) → name, price, image данные товаров по ids 🔀 Объединение данных порядок ML из Search API сохраняется ✅ Готовый ответ отображается пользователю ЛЕГЕНДА основной поток ответ с данными
ℹ️
Запрос к Search API не должен идти напрямую с фронтенда. Используйте серверный прокси, чтобы не раскрывать apiKey в браузере.
⚠️
Параметр st — это correction из Autocomplete API, а не сырой ввод пользователя. Передача неисправленного запроса ухудшает качество ранжирования.
ℹ️
Блок Autocomplete API на схеме показан пунктиром — он участвует только если на проекте интегрированы автоподсказки. Подробнее — в разделе Коррекция из Autocomplete.
⚙️
Параметры запроса

Обязательные

ПараметрТипОписание
streq string Поисковый запрос пользователя. Если интегрирован Autocomplete — передавать значение поля correction из ответа Autocomplete API.
apiKeyreq string Ключ доступа. Предоставляется командой Diginetica.

Рекомендуемые

ПараметрТипПо умолчаниюОписание
strategystringСтратегия ML-ранжирования. По умолчанию подтягивается из серверной конфигурации сайта; если клиент передаёт значение, оно может быть переопределено серверной конфигурацией. Предоставляется командой Diginetica.
sizeinteger400Количество товаров на страницу. Минимум 1, максимум 2000 (при fullData=false). В примере ниже используется size=20 для краткости.
offsetinteger0Смещение для пагинации.
withFacetsbooleanfalseВключить фасеты (фильтры) в ответ.
withCorrectionbooleanfalseВернуть исправленный запрос.
showUnavailablebooleanfalseВключить недоступные товары.
regionIdstringglobalID региона / фида.
filterstringФильтр по атрибуту. Параметр повторяемый.
sortstringDEFAULTDEFAULT, PRICE_ASC, PRICE_DESC.

Дополнительные параметры (из Swagger, расширенный набор)

Параметры ниже описаны в Swagger, но используются реже. Большинство клиентов работает с основным набором выше; дополнительные параметры применяются в особых сценариях или тонкой настройке.

ПараметрТипПо умолчаниюОписание
useCompletionbooleanне задан в SwaggerДописывать часть запроса до предиктивно выбранного полного слова. Дефолтное значение в Swagger не зафиксировано — уточняйте у команды Diginetica.
treeFacetsbooleanfalseФормат иерархии фасетов категорий: true — дерево, false — плоский список.
unavailableMultipliernumber0.2Множитель скоринга для недоступных товаров (0–1).
withSkubooleanfalseГруппировать товары в мультикарточки по полю group_id из фида.
productIdstringID товара-якоря для контекстных стратегий ранжирования.
useCategoryPredictionbooleanВключить предсказание категории по запросу (буст товаров из предсказанной категории).
previewbooleanfalseРежим preview — возвращает дополнительную отладочную информацию о ранжировании.
exceptionIdsstringID товаров, которые нужно исключить из выдачи (через запятую).
showRatingbooleanfalseВключить в ответ поля rating и totalRatings товаров.
modelNamestringИмя ML-модели ранжирования. Обычно берётся из серверной конфигурации сайта.
ℹ️
Не передавать fullData=true в этом методе. По умолчанию параметр равен false — явно передавать его не нужно.
🔗
Пример запроса
HTTP
GET https://sort.diginetica.net/search
  ?st=кроссовки
  &apiKey=YOUR_API_KEY
  &strategy=advanced_xname,zero_queries
  &size=20
  &offset=0
  &withFacets=true
  &withCorrection=true
  &showUnavailable=false
  &regionId=msk
ℹ️
Если на проекте интегрирован Autocomplete — значение st должно быть взято из поля correction ответа Autocomplete API. Подробнее — в разделе Коррекция из Autocomplete.
📦
Структура ответа
JSON
{
  "totalHits": 284,
  "zeroQueries": false,
  "correction": "кроссовки",
  "products": [
    { "id": "45678", "available": true,  "score": 0.987 },
    { "id": "45699", "available": true,  "score": 0.951 }
  ],
  "facets": [...],
  "selectedFacets": [...]
}

Поля ответа

ПолеТипОписание
querystringОригинальный поисковый запрос пользователя.
totalHitsintegerОбщее количество найденных товаров.
zeroQueriesbooleanПризнак нулевого ранжирования.
correctionstringИсправленный запрос (при withCorrection=true).
redirectUrlstringURL редиректа (для desktop), если запрос совпал с правилом редиректа.
redirectMobileUrlstringURL редиректа для мобильных устройств.
productsarrayСписок товаров в ранжированном порядке.
products[].idstringOffer ID из фида.
products[].availablebooleanДоступность товара.
products[].scorenumberСкоринговое значение релевантности.
facetsarrayВсе доступные фасеты для запроса.
selectedFacetsarrayФасеты с применёнными фильтрами.

Полный список полей товара (доступны при fullData=true): groupId, ids[], name, brand, link_url, image_url, image_urls[], price, oldPrice, alternative, categories[], attributes{}, skuChoiceAttributes[], skus[], rating, totalRatings. Подробнее — в документе fullData=true.

Обработка ответа
1
Извлечь ID товаров
Собрать массив идентификаторов из поля products.
JS
const ids = response.products.map(p => p.id)
// ["45678", "45699", ...]
2
Загрузить данные из БД одним батч-запросом
Запросить данные по полученным ID из вашей базы. Важно сохранить порядок из API — это порядок ML-ранжирования.
JS
const catalogData = await db.getProductsByIds(ids)
// { "45678": { name, price, image_url, link_url }, ... }
3
Объединить данные, сохранив порядок
Пройтись по response.products в исходном порядке и обогатить каждый объект данными из каталога.
JS
const result = response.products.map(p => ({
  ...catalogData[p.id],
  id:        p.id,
  available: p.available,
  score:     p.score
}))
⚠️
Не сортировать повторно. Порядок из API — это ML-ранжирование. Любая пересортировка ломает его.
4
Обработать краевые случаи
Если ID из API не нашёлся в БД — пропустить. Это может происходить при рассинхронизации фида.
JS
const filtered = result.filter(p => catalogData[p.id] !== undefined)
// Если available: false — показать с пометкой «Нет в наличии»
🔍
Нулевая выдача

Поле zeroQueries сигнализирует о нулевом ранжировании.

zeroQueriestotalHitsЧто показывать
false> 0Стандартная выдача
true> 0Похожие товары с плашкой «По запросу ничего не найдено, возможно вас заинтересует»
true= 0Страница нулевой выдачи: поисковые подсказки, популярные товары
🚫
Не показывать пустую страницу при zeroQueries: true и totalHits: 0. Пользователь должен видеть альтернативный контент.
✏️
Исправление запроса

При withCorrection=true ответ содержит поле correction.

Если correction отличается от исходного st — показать пользователю плашку:

💡
Показаны результаты по запросу «кроссовки».
Искать вместо этого «кросовк»?
ℹ️
При серверной интеграции значение correction передавать в трекинг-поле searchTerm. Исходный запрос пользователя — в originalSearchTerm.
🔄
Коррекция из Autocomplete API

Если на вашем проекте интегрированы автоподсказки, в результаты выдачи должен передаваться запрос пользователя после исправления и дописывания — эти операции выполняются в API Autocomplete.

⚠️
Используйте значение поля correction из ответа Autocomplete API и передавайте его в параметр st при запросе к API sort (Search API). Если передавать исходный ввод пользователя — ранжирование будет работать по неисправленному запросу.

Схема передачи correction

JS
// 1. Пользователь вводит запрос
const userInput = "кросовки"
// 2. Запрос к Autocomplete API (происходит при вводе)
const autocompleteResponse = await fetch(
  `https://autocomplete.diginetica.net/autocomplete?st=${userInput}&apiKey=YOUR_API_KEY`
)
const autocompleteData = await autocompleteResponse.json()
// 3. Берём исправленный запрос из поля correction
const correction = autocompleteData.correction ?? userInput
// correction = "кроссовки"
// 4. Передаём correction в параметр st API sort
const searchResponse = await fetch(
  `https://sort.diginetica.net/search?st=${encodeURIComponent(correction)}&apiKey=YOUR_API_KEY&strategy=...`
)

Что куда передавать

Источник значенияКуда передавать
correction из Autocomplete API Параметр st в API sort (Search API)
Исходный ввод пользователя Поле originalSearchTerm в трекинг-событии
correction из Autocomplete API Поле searchTerm в трекинг-событии
ℹ️
Если поле correction в ответе Autocomplete API отсутствует или пусто — используйте исходный запрос пользователя как есть.
🎛️
Фасеты и фильтры

Фасеты возвращаются при withFacets=true. Структура одного фасета:

JSON
{
  "name": "Бренд",
  "dataType": "DISTINCT",
  "values": [
    { "id": "Nike",   "name": "Nike",   "value": 34 },
    { "id": "Adidas", "name": "Adidas", "value": 28 }
  ]
}

Типы фасетов

dataTypeОтображение
DISTINCTЧекбоксы
NUM_DISTINCTЧекбоксы с числами
BOOLEANПереключатель
RANGESРадиокнопки с диапазонами
SLIDERСлайдер диапазона цен

Пример UI: sticky-фасеты

Фасеты рекомендуется закреплять при скролле (position: sticky), чтобы пользователь мог применять фильтры не возвращаясь наверх страницы.

Фильтры
Бренд
Nike34
Adidas28
Puma17
Цена, ₽
до 3 00012
3 000–8 00029
от 8 0008
Цвет
Белый21
Чёрный18
📌 position: sticky
👟
Nike Air Max 90
6 490 ₽
👟
Nike React Infinity
7 990 ₽
👟
Nike Revolution 6
4 290 ₽
👟
Nike Downshifter 12
3 790 ₽
👟
Nike Pegasus 40
8 490 ₽

CSS для sticky-фасетов

CSS
.search-layout {
  display: flex;
  gap: 24px;
  align-items: flex-start;
}
.facets-panel {
  width: 220px;
  position: sticky;
  top: 24px;
  max-height: calc(100vh - 48px);
  overflow-y: auto;
}
.results-col {
  flex: 1;
  min-width: 0;
}
ℹ️
Важно: родительский контейнер не должен иметь overflow: hidden или overflow: auto — иначе position: sticky не будет работать.

Синтаксис фильтров

ЗадачаСинтаксис
Одно значениеfilter=brands:Nike
OR (одно из)filter=brands:Nike;Adidas
AND (оба)filter=brands:Nike&filter=brands:Adidas
Диапазон ценfilter=price:2000;15000
По категорииfilter=categories:12967
По атрибутуfilter=Цвет:синий
⚠️
Название атрибута чувствительно к регистру. filter=цвет:синий не сработает, если атрибут в фиде называется Цвет. Значение атрибута приводится к нижнему регистру автоматически.
ℹ️
Фасеты не нужно запрашивать отдельным запросом. Они возвращаются в том же ответе при withFacets=true.
⏱️
Таймаут и fallback

Таймаут для /search2000 мс.

🚫
При превышении таймаута не показывать пустую страницу. Возвращать результаты стандартного поиска платформы (fallback).
📡
Трекинг
SEARCH_EVENT · POST tracking-app.diginetica.net/event

После каждого поискового запроса отправить событие SEARCH_EVENT на tracking-app.diginetica.net/event.

Поля события SEARCH_EVENT

ℹ️
Базовые обязательные поля (apiKey, sessionId, userGUID, channel) передаются во всех событиях трекинга и здесь не дублируются. Ниже перечислены поля, специфичные для SEARCH_EVENT и рекомендуемые к передаче.
ПолеЗначение
eventType"SEARCH_EVENT"
searchTerm Если интегрирован Autocomplete — значение correction из Autocomplete API. Иначе — correction из ответа Search API, или st если коррекции не было.
originalSearchTermИсходный запрос пользователя (до любых исправлений)
pageProductsМассив id товаров текущей страницы
pageNumberНомер текущей страницы (целое число, integer)
isZeroQueryЗначение zeroQueries из ответа Search API. Передавать как строку ("true" или "false").
anyQueryWorkedСтрока "true" или "false". "true", если searchTerm !== originalSearchTerm.
⚠️
Если на проекте интегрирован Autocomplete: в поле searchTerm передавать значение correction из ответа Autocomplete API — именно тот запрос, который был передан в st API sort.

Когда отправлять

При загрузке страницы результатов · При смене страницы (пагинация) · При применении / сбросе фильтра · При смене сортировки
🚫
Не отправлять при каждом символе ввода (это задача AUTOCOMPLETE_CLICK) и при скролле без смены страницы.

Пример тела события

JSON
{
  "eventType": "SEARCH_EVENT",
  "sessionId": "[UUID]",
  "userGUID": "0:kzmrfk1k:[UUID]",
  "apiKey": "YOUR_API_KEY",
  "location": "https://example.com/search?q=кросовки",
  "referer": "https://example.com/",
  "regionId": "msk",
  "viewGUID": "[UUID]",
  "searchTerm": "кроссовки",
  "originalSearchTerm": "кросовки",
  "channel": "WEB",
  "pageProducts": ["45678", "45699", "45700"],
  "pageNumber": 1,
  "isZeroQuery": "false",
  "anyQueryWorked": "true"
}
🐛
Частые ошибки
Неправильный порядок товаров
После объединения с данными из БД результат пересортирован по цене или популярности. ML-ранжирование потеряно.
Запрос идёт с фронтенда напрямую
apiKey раскрыт в браузере. Все запросы к API — только через бэкенд.
totalHits используется как длина массива products
totalHits — общее количество найденных товаров во всей выдаче. products — только текущая страница.
Не обрабатывается zeroQueries: true
Пользователь видит пустую страницу вместо альтернативной выдачи или блока «Возможно, вас заинтересует».
Фасеты запрашиваются отдельным запросом
Фасеты возвращаются в том же запросе при withFacets=true. Второй запрос не нужен.
Фасеты не закреплены при скролле
Фасеты должны быть position: sticky, чтобы пользователь мог применять фильтры не прокручивая страницу наверх.
Фильтр по атрибуту передаётся с неверным регистром
filter=цвет:синий не сработает, если атрибут в фиде называется Цвет. Название чувствительно к регистру.
В трекинге передаётся исходный запрос вместо исправленного
В поле searchTerm нужно передавать исправленный запрос. Если интегрирован Autocomplete — значение correction из Autocomplete API.
При наличии Autocomplete в st передаётся исходный ввод пользователя
Если интегрирован Autocomplete, в параметр st API sort нужно передавать значение поля correction из ответа Autocomplete API, а не сырой ввод пользователя.
Чеклист перед релизом
  • apiKey не передаётся с фронтенда — используется серверный прокси
  • Таймаут 2000 мс настроен, fallback на стандартный поиск реализован
  • Порядок товаров из API сохраняется после обогащения данными из БД
  • Обрабатывается zeroQueries: true при totalHits > 0 — показываются альтернативные товары с плашкой
  • Обрабатывается zeroQueries: true при totalHits = 0 — показывается страница нулевой выдачи
  • Отправляется трекинг-событие SEARCH_EVENT на каждую страницу выдачи
  • searchTerm в трекинге — исправленный запрос (при наличии Autocomplete — correction из Autocomplete API)
  • Если интегрирован Autocomplete — в параметр st API sort передаётся поле correction из ответа Autocomplete API
  • Пагинация реализована через offset, не дублирует товары
  • Товары, не найденные в БД, фильтруются без ошибки
  • Фасеты запрашиваются в том же запросе через withFacets=true
  • Фасеты закреплены при скролле (position: sticky)
  • Недоступные товары при showUnavailable=true отображаются с пометкой, не скрываются
  • При исправлении запроса пользователю показывается плашка с оригинальным вариантом