Метод предполагает, что Search API возвращает только идентификаторы товаров (id)
и минимальные служебные атрибуты. Все отображаемые данные — название, цена, изображение, ссылка —
подтягиваются из собственной базы данных или кеша платформы по полученным ID.
Это рекомендуемый метод для production-интеграции: он быстрее, снижает нагрузку на API и даёт полный контроль над отображаемыми данными.
| Сценарий | fullData=false | fullData=true |
|---|---|---|
| Production-интеграция | ✅ рекомендуется | — |
| Быстрый прототип / MVP | — | ✅ |
| Есть собственная БД товаров | ✅ | — |
| Нет доступа к БД на бэкенде | — | ✅ |
| Нужна скорость ответа | ✅ | — |
| Лимит на размер выдачи | до 2000 товаров | до 400 товаров |
Схема показывает полный путь запроса — от браузера до объединённого ответа фронтенду. Блок Autocomplete API участвует только если на проекте интегрированы автоподсказки.
apiKey в браузере.
st — это correction из Autocomplete API,
а не сырой ввод пользователя. Передача неисправленного запроса ухудшает качество ранжирования.
Обязательные
| Параметр | Тип | Описание |
|---|---|---|
| streq | string | Поисковый запрос пользователя. Если интегрирован Autocomplete — передавать значение поля correction из ответа Autocomplete API. |
| apiKeyreq | string | Ключ доступа. Предоставляется командой Diginetica. |
Рекомендуемые
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
| strategy | string | — | Стратегия ML-ранжирования. По умолчанию подтягивается из серверной конфигурации сайта; если клиент передаёт значение, оно может быть переопределено серверной конфигурацией. Предоставляется командой Diginetica. |
| size | integer | 400 | Количество товаров на страницу. Минимум 1, максимум 2000 (при fullData=false). В примере ниже используется size=20 для краткости. |
| offset | integer | 0 | Смещение для пагинации. |
| withFacets | boolean | false | Включить фасеты (фильтры) в ответ. |
| withCorrection | boolean | false | Вернуть исправленный запрос. |
| showUnavailable | boolean | false | Включить недоступные товары. |
| regionId | string | global | ID региона / фида. |
| filter | string | — | Фильтр по атрибуту. Параметр повторяемый. |
| sort | string | DEFAULT | DEFAULT, PRICE_ASC, PRICE_DESC. |
Дополнительные параметры (из Swagger, расширенный набор)
Параметры ниже описаны в Swagger, но используются реже. Большинство клиентов работает с основным набором выше; дополнительные параметры применяются в особых сценариях или тонкой настройке.
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
| useCompletion | boolean | не задан в Swagger | Дописывать часть запроса до предиктивно выбранного полного слова. Дефолтное значение в Swagger не зафиксировано — уточняйте у команды Diginetica. |
| treeFacets | boolean | false | Формат иерархии фасетов категорий: true — дерево, false — плоский список. |
| unavailableMultiplier | number | 0.2 | Множитель скоринга для недоступных товаров (0–1). |
| withSku | boolean | false | Группировать товары в мультикарточки по полю group_id из фида. |
| productId | string | — | ID товара-якоря для контекстных стратегий ранжирования. |
| useCategoryPrediction | boolean | — | Включить предсказание категории по запросу (буст товаров из предсказанной категории). |
| preview | boolean | false | Режим preview — возвращает дополнительную отладочную информацию о ранжировании. |
| exceptionIds | string | — | ID товаров, которые нужно исключить из выдачи (через запятую). |
| showRating | boolean | false | Включить в ответ поля rating и totalRatings товаров. |
| modelName | string | — | Имя ML-модели ранжирования. Обычно берётся из серверной конфигурации сайта. |
fullData=true в этом методе.
По умолчанию параметр равен false — явно передавать его не нужно.
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
®ionId=msk
st должно быть
взято из поля correction ответа Autocomplete API.
Подробнее — в разделе Коррекция из Autocomplete.
{
"totalHits": 284,
"zeroQueries": false,
"correction": "кроссовки",
"products": [
{ "id": "45678", "available": true, "score": 0.987 },
{ "id": "45699", "available": true, "score": 0.951 }
],
"facets": [...],
"selectedFacets": [...]
}
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
| query | string | Оригинальный поисковый запрос пользователя. |
| totalHits | integer | Общее количество найденных товаров. |
| zeroQueries | boolean | Признак нулевого ранжирования. |
| correction | string | Исправленный запрос (при withCorrection=true). |
| redirectUrl | string | URL редиректа (для desktop), если запрос совпал с правилом редиректа. |
| redirectMobileUrl | string | URL редиректа для мобильных устройств. |
| products | array | Список товаров в ранжированном порядке. |
| products[].id | string | Offer ID из фида. |
| products[].available | boolean | Доступность товара. |
| products[].score | number | Скоринговое значение релевантности. |
| facets | array | Все доступные фасеты для запроса. |
| selectedFacets | array | Фасеты с применёнными фильтрами. |
Полный список полей товара (доступны при fullData=true): groupId, ids[], name, brand, link_url, image_url, image_urls[], price, oldPrice, alternative, categories[], attributes{}, skuChoiceAttributes[], skus[], rating, totalRatings. Подробнее — в документе fullData=true.
products.const ids = response.products.map(p => p.id)
// ["45678", "45699", ...]
const catalogData = await db.getProductsByIds(ids)
// { "45678": { name, price, image_url, link_url }, ... }
response.products в исходном порядке и обогатить каждый объект данными из каталога.const result = response.products.map(p => ({
...catalogData[p.id],
id: p.id,
available: p.available,
score: p.score
}))
const filtered = result.filter(p => catalogData[p.id] !== undefined)
// Если available: false — показать с пометкой «Нет в наличии»
Поле zeroQueries сигнализирует о нулевом ранжировании.
| zeroQueries | totalHits | Что показывать |
|---|---|---|
false | > 0 | Стандартная выдача |
true | > 0 | Похожие товары с плашкой «По запросу ничего не найдено, возможно вас заинтересует» |
true | = 0 | Страница нулевой выдачи: поисковые подсказки, популярные товары |
zeroQueries: true и totalHits: 0.
Пользователь должен видеть альтернативный контент.
При withCorrection=true ответ содержит поле correction.
Если correction отличается от исходного st — показать пользователю плашку:
Искать вместо этого «кросовк»?
correction передавать в трекинг-поле searchTerm.
Исходный запрос пользователя — в originalSearchTerm.
Если на вашем проекте интегрированы автоподсказки, в результаты выдачи должен передаваться запрос пользователя после исправления и дописывания — эти операции выполняются в API Autocomplete.
correction из ответа Autocomplete API
и передавайте его в параметр st при запросе к API sort (Search API).
Если передавать исходный ввод пользователя — ранжирование будет работать по неисправленному запросу.
Схема передачи correction
// 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. Структура одного фасета:
{
"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), чтобы пользователь мог применять фильтры не возвращаясь наверх страницы.
CSS для sticky-фасетов
.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.
Search API использует offset-based пагинацию.
Страница 1: size=20&offset=0
Страница 2: size=20&offset=20
Страница 3: size=20&offset=40
const totalPages = Math.ceil(response.totalHits / size)
totalHits — не длина массива products.
totalHits — общее количество найденных товаров во всей выдаче.
products содержит только текущую страницу.
fullData=false максимальный size — 2000.
Не запрашивать все товары одним запросом — использовать пагинацию.
Таймаут для /search — 2000 мс.
После каждого поискового запроса отправить событие 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. |
searchTerm передавать
значение correction из ответа Autocomplete API — именно тот запрос,
который был передан в st API sort.
Когда отправлять
AUTOCOMPLETE_CLICK)
и при скролле без смены страницы.
Пример тела события
{
"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"
}
apiKey раскрыт в браузере. Все запросы к API — только через бэкенд.totalHits используется как длина массива productstotalHits — общее количество найденных товаров во всей выдаче. products — только текущая страница.zeroQueries: truewithFacets=true. Второй запрос не нужен.position: sticky, чтобы пользователь мог применять фильтры не прокручивая страницу наверх.filter=цвет:синий не сработает, если атрибут в фиде называется Цвет. Название чувствительно к регистру.searchTerm нужно передавать исправленный запрос. Если интегрирован Autocomplete — значение correction из Autocomplete API.st передаётся исходный ввод пользователя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 — в параметр
stAPI sort передаётся полеcorrectionиз ответа Autocomplete API - Пагинация реализована через
offset, не дублирует товары - Товары, не найденные в БД, фильтруются без ошибки
- Фасеты запрашиваются в том же запросе через
withFacets=true - Фасеты закреплены при скролле (
position: sticky) - Недоступные товары при
showUnavailable=trueотображаются с пометкой, не скрываются - При исправлении запроса пользователю показывается плашка с оригинальным вариантом