AACSearch / руководство
События и рекомендации
Отправляйте поведенческие события с витрины, настраивайте модели рекомендаций в коллекции и получайте похожие товары, «покупают вместе», тренды и персональные рекомендации.
Рекомендации учатся на действиях посетителей, поэтому работа состоит из двух частей: отправлять события с витрины и запрашивать рекомендации у модели. Оба вызова доступны поисковой области и могут выполняться из браузера с поисковым или браузерным ключом (см. ключи и области доступа). Создание и изменение моделей требует полного ключа.
События
ingestEvents — POST /events — записывает пакет из 1–500 событий:
await client.events.ingestEvents({
events: [
{ type: "search", collection: "products", session_id, q: "дрель", found: 0, query_id },
{ type: "click", collection: "products", session_id, query_id, doc_ids: ["42"], positions: [3] },
{
type: "purchase",
collection: "products",
session_id,
doc_ids: ["42"],
value: 12990,
currency: "RUB",
event_id: crypto.randomUUID(),
},
],
});Каждому событию нужны type и collection. type — одно из search, view,
click, add_to_cart, purchase, conversion, impression, favorite,
wishlist, share, dismiss, suggestion_impression, suggestion_select,
chip_click, correction_accept, correction_reject.
| Поле | Назначение |
|---|---|
session_id | сессия просмотра — обязательна для сессионных моделей и моделей совместных просмотров (related_items, bought_together, session) |
user_id / anonymous_id | стабильный id вошедшего пользователя или id устройства/cookie |
doc_ids, positions | затронутые документы и их позиции (с 1) в списке, где они были показаны |
query_id | ответ поиска или рекомендаций, с которым взаимодействовал посетитель, — атрибутирует клики и покупки |
q, found, filter_by | для событий search; запросы без результатов (found: 0) питают предложения синонимов |
value, currency, objects | деньги: сумма, код ISO 4217, цена и количество по документам |
timestamp | Unix-время в миллисекундах; по умолчанию — время получения |
event_id | ваш ключ идемпотентности (UUID) — повтор отбрасывается, а не сохраняется дважды |
analytics_tag | произвольная метка для сегментации аналитики |
API проверяет пакет сразу, а сохраняет асинхронно. Ответ — 202:
{ "accepted": 2, "deduplicated": 1, "rejected": [{ "index": 4, "reason": "…" }] }Отклонённое событие указывается по индексу в пакете; остальные сохраняются.
Повторять пакет безопасно, если у каждого события есть event_id.
Используйте один query_id на страницу результатов и отправляйте его с кликами и
покупками, которые с неё пришли. Готовые виджеты рекомендаций передают id модели
как query_id в записываемых кликах.
Модели рекомендаций
Модель живёт в коллекции:
| Операция | Эндпоинт |
|---|---|
upsertRecommendationModel | PUT /collections/{collectionName}/recommendation_models/{modelId} |
getRecommendationModel, deleteRecommendationModel | тот же путь с GET / DELETE |
listRecommendationModels | GET /collections/{collectionName}/recommendation_models |
await client.recommendations.upsertRecommendationModel({
collectionName: "products",
modelId: "similar",
body: { type: "looking_similar", vector_field: "embedding", filter_by: "in_stock:true" },
});
await client.recommendations.upsertRecommendationModel({
collectionName: "products",
modelId: "trending",
body: {
type: "trending",
event_weights: { view: 1, add_to_cart: 3, purchase: 5 },
decay_half_life_hours: 48,
window_days: 14,
},
});type | Что рекомендует | Якорь в запросе |
|---|---|---|
looking_similar | ближайшие соседи по vector_field | object_id |
related_items | документы, просмотренные в тех же сессиях | object_id |
bought_together | документы, купленные в тех же сессиях | object_id |
trending | больше всего недавних взвешенных взаимодействий | нет |
popular | простые взвешенные счётчики за окно, без затухания | нет |
session | соседи среднего вектора того, с чем работала сессия | session_id или user_id |
query_to_item | документы, которые кликали или покупали вскоре после поиска query | query |
upsell | товары той же категории дороже якоря (upsell_max_ratio) | object_id |
cross_sell / complementary | товары, связанные с якорем графом товаров и совместными покупками | object_id |
substitutes / alternatives | товары той же категории в пределах price_tolerance от цены якоря | object_id |
recently_viewed | с чем субъект взаимодействовал последним | user_id, anonymous_id или session_id |
recently_searched | недавние запросы субъекта, возвращаются в queries | user_id, anonymous_id или session_id |
sequential | следующие товары по переходам A→B внутри сессий | якоря или субъект |
graph | обход рёбер edge_kinds на 1–hops шагов от якорей | object_id / object_ids |
Общие настройки: event_weights (по типам событий; незаданные считаются 0),
window_days (по умолчанию 30), decay_half_life_hours (для trending, по
умолчанию 72), filter_by (применяется к каждому результату), exclude_filter_by
(никогда не рекомендовать такие), category_field и price_field (для типов на
основе категории и цены), pins для гарантированных мест.
Получение рекомендаций
getRecommendations — POST /collections/{collectionName}/recommendations:
const similar = await client.recommendations.getRecommendations({
collectionName: "products",
model_id: "similar",
object_id: "42",
k: 8,
exclude_ids: cartIds,
});| Поле | Значение |
|---|---|
model_id | обязательно |
object_id / object_ids | якорный документ(ы); рекомендации нескольких якорей объединяются |
session_id, user_id, anonymous_id | субъект, для персональных моделей |
query | текст поиска, для query_to_item |
k | сколько вернуть — по умолчанию 10, максимум 100 |
filter_by | объединяется с фильтром модели |
exclude_ids | исключить, например товары уже в корзине |
include_fields, exclude_fields | состав документа в каждом хите |
Ответ содержит model_id, hits в той же форме, что и результаты поиска
(один рендер для обоих), took_ms, queries для моделей recently_searched (с
пустыми hits) и experiment, если запрос попал в запущенный эксперимент.
Замкните цикл
Отправляйте показы
Отправляйте события impression для показанных рекомендаций с doc_ids и
positions.
Отправляйте результаты действий
Отправляйте click, add_to_cart и purchase с тем же query_id.
Дайте моделям, обучающимся на событиях, накопить данные
Модели, которые учатся на событиях (related_items, bought_together,
trending, popular, session, query_to_item, sequential), улучшаются по
мере накопления событий в пределах window_days. Новый каталог можно начать с
looking_similar — ей нужно только векторное поле.
Правила поиска и синонимы
Мерчандайзинг коллекции с сервера — фильтр исключения, бусты, закрепления, редиректы, разнообразие, fallback при нуле результатов, расписание — и словарь: синонимы, стоп-слова, словари стемминга.
Правила аналитики и метрики
Метрики качества поиска, вычисляемые по вашим событиям, и отдельный движок именованных правил аналитики для счётчиков и журналов запросов.