AACSearch
Начало работы

Быстрый старт

Создайте индекс, выпустите ключ, загрузите документы и выполните первый поиск — целиком на curl.

Начните в консоли

После подтверждения email выберите Поиск на сайте или Поиск через API. Задайте название поиска — первое рабочее пространство создастся вместе с ним. В мастере три шага: Данные → Проверка → Подключение. Для сайта доступны предпросмотр файла, выбор полей, CMS и выгрузки. Разработчик получает серверный ключ для конкретного поиска и заполненные примеры запросов. Перед подключением выполните успешный поиск в предпросмотре. Созданный ключ или скопированный код ещё не означают установку: выполните запрос с сайта или приложения, затем завершите настройку. Прогресс сохраняется; схема и ранжирование доступны отдельно.

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

1. Создайте индекс

Индекс создаётся в консоли: Search → Indexes → New index. Укажите название, при необходимости слаг (если не указать, он будет собран из названия, а при совпадении получит суффикс -2, -3) и схему, если стандартных полей недостаточно.

Минимальному индексу для сайта документации дополнительные поля не нужны. Для каталога товаров обычно объявляют то, по чему планируется фильтровать:

{
	"name": "Documentation",
	"slug": "documentation",
	"fields": [
		{ "name": "category", "type": "string", "facet": true },
		{ "name": "published_at", "type": "int64", "sort": true },
		{ "name": "views", "type": "int32", "optional": true }
	]
}

Консоль проверяет эту схему и создаёт управляемый индекс. В API используйте его логический slug:

{
	"id": "idx_01HZX8",
	"slug": "documentation",
	"name": "Documentation"
}

Имена полей должны соответствовать ^[a-zA-Z_][a-zA-Z0-9_]{0,63}$ и не пересекаться с зарезервированными (id, external_id, title, content, url, source_type, organization_id, tags, indexed_at, metadata).

2. Выпустите API-ключ

Search → API keys → New key. Выберите нужные права. Набор по умолчанию — search:read, documents:read, documents:write — подходит для задачи загрузки. Добавьте settings:write для переиндексации и ограниченных ключей, analytics:write для учёта кликов.

Ключ возвращается ровно один раз:

{
	"id": "key_01HZX9",
	"name": "Ingest",
	"prefix": "aac_live_9f3c2a1b…",
	"scopes": ["search:read", "documents:read", "documents:write"],
	"createdAt": "2026-10-23T09:12:44.000Z",
	"key": "aac_live_9f3c2a1bD4eF6gH8iJ0kL2mN4oP6qR8s"
}

В продакшн-организациях ключ имеет вид aac_live_…, вне продакшена генерируется aac_test_…. Хранится только SHA-256-хеш: если ключ потерян, его отзывают и выпускают новый.

Сохраните его в переменную для команд ниже:

export AAC_KEY="aac_live_9f3c2a1bD4eF6gH8iJ0kL2mN4oP6qR8s"
export AAC_API="https://search.example.com/api/v1"

3. Загрузите документы

Обязательны только external_id и content, остальное опционально. Поля вашей схемы передаются как обычные ключи верхнего уровня.

curl -sS -X POST "$AAC_API/indexes/documentation/documents" \
  -H "Authorization: Bearer $AAC_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "documents": [
      {
        "external_id": "pricing",
        "title": "Тарифы",
        "content": "На бесплатном тарифе доступно 10 000 поисков в месяц. Pro стоит 29 USD в месяц и включает 500 000 поисков.",
        "url": "https://example.com/pricing",
        "tags": ["billing"]
      },
      {
        "external_id": "limits",
        "title": "Лимиты запросов",
        "content": "Один API-ключ может делать 600 запросов в минуту в рамках скользящего окна.",
        "url": "https://example.com/limits",
        "tags": ["api"]
      }
    ],
    "action": "upsert"
  }'
{
	"index": "documentation",
	"indexed": 2,
	"failed": [],
	"usage": {
		"plan": "pro",
		"planName": "Pro",
		"period": "2026-10",
		"resetsAt": "2026-11-01T00:00:00.000Z",
		"searches": { "used": 0, "limit": 500000 },
		"documents": { "used": 2, "limit": 50000 },
		"aiTokens": { "used": 0, "limit": 100000 },
		"indexes": { "used": 1, "limit": 10 },
		"apiKeys": { "used": 1, "limit": 10 },
		"connectors": { "used": 0, "limit": 10 },
		"wallet": { "balanceCents": 0, "currency": "USD" }
	},
	"request_id": "req_5b1d9c0a7e2f4a6b8c0d1e2f"
}

Пакет не является «всё или ничего»: отклонённые документы попадают в failed в виде { "external_id", "error" }, остальные индексируются. В одном запросе — до 500 документов.

4. Выполните первый поиск

curl -sS -G "$AAC_API/indexes/documentation/search" \
  -H "Authorization: Bearer $AAC_KEY" \
  --data-urlencode "q=тарифы" \
  --data-urlencode "query_by=title,content" \
  --data-urlencode "per_page=5"
{
	"index": "documentation",
	"query": "тарифы",
	"language": "ru",
	"found": 1,
	"out_of": 2,
	"page": 1,
	"per_page": 5,
	"took_ms": 12,
	"engine_ms": 3,
	"hits": [
		{
			"id": "pricing",
			"score": 1754,
			"document": {
				"id": "pricing",
				"external_id": "pricing",
				"title": "Тарифы",
				"content": "На бесплатном тарифе доступно 10 000 поисков в месяц…",
				"url": "https://example.com/pricing",
				"source_type": "api",
				"organization_id": "org_01h9",
				"tags": ["billing"],
				"indexed_at": 1761214364
			},
			"highlights": [
				{ "field": "title", "snippet": "<mark>Тарифы</mark>", "matchedTokens": ["тарифы"] }
			]
		}
	],
	"facets": [],
	"request_id": "req_9a7c3d1e5f0b2a4c6d8e0f1a"
}

В заголовках ответа приходят цифры, нужные для back-off и мониторинга:

x-aac-quota-limit: 500000
x-aac-quota-remaining: 499999
x-aac-index: documentation
x-aac-profile: default
x-aac-charged-cents: 0
x-ratelimit-limit: 600
x-ratelimit-remaining: 599
x-ratelimit-reset: 1761214424
x-request-id: req_9a7c3d1e5f0b2a4c6d8e0f1a

Поиск без совпадений — это успешный ответ с found: 0; он попадает в журнал как запрос без результатов и виден в /analytics/alerts.

5. Подключите автодополнение

curl -sS -G "$AAC_API/indexes/documentation/suggest" \
  -H "Authorization: Bearer $AAC_KEY" \
  --data-urlencode "q=тар" \
  --data-urlencode "limit=5"
{
	"index": "documentation",
	"query": "тар",
	"suggestions": [
		{
			"text": "Тарифы",
			"source": "document",
			"documentId": "pricing",
			"url": "https://example.com/pricing",
			"score": 3,
			"highlight": "<mark>Тар</mark>ифы"
		}
	],
	"did_you_mean": null,
	"sources": { "documents": 1, "queries": 0 },
	"cache": "miss",
	"request_id": "req_1c2d3e4f5a6b7c8d9e0f1a2b"
}

Запросы подсказок ограничены по частоте, но не расходуют квоту: автодополнение, которое списывает деньги за каждое нажатие клавиши, бесполезно.

Куда дальше

On this page