Интеграция поиска с Sanity.io — GROQ-экспорт через AACsearch
Alex Chibilyaev
5/3/2026
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 мощный, но сложный. Коннектор автоматически:
- Извлекает URL изображений из ссылок
image.asset->url - По желанию применяет трансформации Sanity (
w=600&h=600&fit=crop) - Включает
alt-текст из метаданных изображения - Обрабатывает 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"
}
}
Настройка коннектора
- Сгенерируйте API-токен Sanity с правами на чтение вашего набора данных
- Настройте GROQ-запросы в панели управления AACsearch для каждого типа контента
- Сопоставьте поля со схемой AACsearch (string, number, facet, geo и т.д.)
- Запустите синхронизацию — начальный массовый импорт выполняется сразу
- Включите реальное время для мгновенного обновления при изменении контента
Уникальные преимущества
Структурированная модель контента Sanity исключительно хорошо сочетается с AACsearch:
- Блоки и Portable Text: преобразование форматированного текста в доступный для поиска обычный текст
- Ссылки: автоматическое разрешение ссылок
->во вложенные объекты - Массивы: преобразование полей-массивов в форматы, совместимые с фасетами
- Интернационализация: каждое языковое поле становится независимо доступным для поиска
- Черновики: индексируются только опубликованные документы (настраивается)
Сценарии использования
- Сайты с большим объёмом контента — поиск по статьям, руководствам и документации
- Каталоги товаров — фасетный поиск по структурированным данным товаров Sanity
- Многоязычные сайты — поиск с учётом языка благодаря i18n на уровне полей Sanity
- Совместная работа в реальном времени — поиск отражает изменения сразу после публикации редакторами
Коннектор AACsearch для Sanity.io находится в разработке. Получите ранний доступ, чтобы узнать о запуске первыми.