Интеграция поиска с Sanity.io — GROQ-экспорт через AACsearch

Alex Chibilyaev

Alex Chibilyaev

5/3/2026

#sanity#cms#integration#connector#headless#groq#realtime
Интеграция поиска с Sanity.io — GROQ-экспорт через AACsearch

Sanity.io — это программируемая CMS, созданная для структурированного контента, совместной работы в реальном времени и настраиваемого редактирования. Благодаря GROQ (GROQ Query Language) Sanity предоставляет SQL-подобные запросы к вашему контенту. Но, как и любая CMS, Sanity — это платформа для управления контентом, а не поисковый движок. Для поиска, ориентированного на пользователя, с устойчивостью к опечаткам, фасетной навигацией и ранжированием по релевантности, вам нужен AACsearch.

Зачем Sanity нужен поисковый слой

GROQ от Sanity отлично подходит для запросов контента, но имеет ограничения для поиска:

  • Нет нечёткого поиска: только точные совпадения
  • Нет ранжирования по релевантности: результаты сортируются по выражениям GROQ, а не по релевантности
  • Нет устойчивости к опечаткам: опечатки пользователя = нулевой результат
  • Производительность запросов: GROQ-запросы сканируют весь набор данных — при масштабировании это медленно для поисковых сценариев
  • Лимиты API: API Sanity не рассчитан на высокочастотные публичные запросы

AACsearch добавляет поисковый слой, который синхронизируется с содержимым Sanity, получаемым через GROQ.

Как работает коннектор Sanity

Экспорт на основе GROQ

Коннектор использует GROQ-запросы для извлечения контента из Sanity:

// Пример GROQ-запроса для индексации товарного поиска
*[_type == "product" && defined(slug.current)] {
  _id,
  title,
  slug,
  "description": pt::text(body),
  price,
  categories[]->{ title },
  "tags": tags[],
  "mainImage": mainImage.asset->url,
  "gallery": gallery[].asset->url,
  _updatedAt
}

Слушатель в реальном времени

Помимо периодического экспорта, коннектор использует API实时ных слушателей Sanity для мгновенного обновления:

import sanityClient from "@sanity/client";

const client = sanityClient({
	projectId: "your-project",
	dataset: "production",
	apiVersion: "2024-01-01",
	useCdn: false,
});

// Слушаем изменения товаров
const subscription = client
	.listen(
		'*[_type == "product"]',
		{},
		{ includeResult: true, events: ["create", "update", "delete"] },
	)
	.subscribe((event) => {
		if (event.type === "mutation") {
			// Обрабатываем создание документа
			if (event.result) {
				AACSearch.index({
					collection: "products",
					document: mapSanityDoc(event.result),
				});
			}
		}
	});

Обработка изображений

Конвейер обработки изображений Sanity мощный, но сложный. Коннектор автоматически:

  1. Извлекает URL изображений из ссылок image.asset->url
  2. По желанию применяет трансформации Sanity (w=600&h=600&fit=crop)
  3. Включает alt-текст из метаданных изображения
  4. Обрабатывает SVG, WebP и адаптивные наборы изображений

Конфигурация

{
	"projectId": "your-sanity-project",
	"dataset": "production",
	"queries": [
		{
			"name": "products",
			"groq": "*[_type == 'product' && defined(slug.current)]",
			"collection": "products",
			"schedule": "*/5 * * * *",
			"realtime": true
		},
		{
			"name": "articles",
			"groq": "*[_type == 'article' && defined(slug.current) && publishAt < now()]",
			"collection": "articles",
			"schedule": "*/15 * * * *",
			"realtime": true
		}
	],
	"imageOptions": {
		"width": 800,
		"quality": 80,
		"format": "auto"
	}
}

Настройка коннектора

  1. Сгенерируйте API-токен Sanity с правами на чтение вашего набора данных
  2. Настройте GROQ-запросы в панели управления AACsearch для каждого типа контента
  3. Сопоставьте поля со схемой AACsearch (string, number, facet, geo и т.д.)
  4. Запустите синхронизацию — начальный массовый импорт выполняется сразу
  5. Включите реальное время для мгновенного обновления при изменении контента

Уникальные преимущества

Структурированная модель контента Sanity исключительно хорошо сочетается с AACsearch:

  • Блоки и Portable Text: преобразование форматированного текста в доступный для поиска обычный текст
  • Ссылки: автоматическое разрешение ссылок -> во вложенные объекты
  • Массивы: преобразование полей-массивов в форматы, совместимые с фасетами
  • Интернационализация: каждое языковое поле становится независимо доступным для поиска
  • Черновики: индексируются только опубликованные документы (настраивается)

Сценарии использования

  • Сайты с большим объёмом контента — поиск по статьям, руководствам и документации
  • Каталоги товаров — фасетный поиск по структурированным данным товаров Sanity
  • Многоязычные сайты — поиск с учётом языка благодаря i18n на уровне полей Sanity
  • Совместная работа в реальном времени — поиск отражает изменения сразу после публикации редакторами

Коннектор AACsearch для Sanity.io находится в разработке. Получите ранний доступ, чтобы узнать о запуске первыми.