Переход с Elasticsearch на AACsearch
Пошаговое руководство по переносу поиска с Elasticsearch на AACsearch. Без управления серверами, без настройки кластеров.
Переход с Elasticsearch на AACsearch позволяет избавиться от управления серверами и сложной инфраструктуры. AACsearch дает такое же качество поиска, но с облачным удобством.
Почему переходить
| Elasticsearch | AACsearch |
|---|---|
| Нужно управлять сервером | Облако — забейте о сервере |
| Сложная настройка | Просто и быстро |
| Нужно следить за диском | Масштабируется автоматически |
| Платите за мощность | Платите за поиски и товары |
Обзор переноса
| Этап | Действие | Время |
|---|---|---|
| 1 | Экспортируйте товары | 10 мин |
| 2 | Создайте индекс в AACsearch | 10 мин |
| 3 | Загрузите товары | 15 мин |
| 4 | Обновите код приложения | 30 мин |
| 5 | Тестируйте и переключайтесь | 15 мин |
Итого: ~80 минут.
Этап 1: Экспортируйте товары из Elasticsearch
Способ 1: Через curl (простой, до 100K товаров)
# Экспортируйте все документы
curl "http://localhost:9200/YOUR_INDEX_NAME/_search?size=10000&scroll=1m" \
| jq '.hits.hits[] | ._source' > elasticsearch-export.jsonСпособ 2: Через Python (для больших объемов)
Если товаров 100K+, используйте скрипт на Python:
from elasticsearch import Elasticsearch
import json
es = Elasticsearch(['http://localhost:9200'])
# Экспортируйте все документы
with open('elasticsearch-export.json', 'w') as f:
for doc in es.helpers.scan(es, index="your_index_name"):
f.write(json.dumps(doc['_source']) + '\n')Проверка файла
Откройте elasticsearch-export.json и убедитесь:
- ✓ Файл содержит ваши товары
- ✓ Есть уникальные идентификаторы (обычно
id) - ✓ Есть текстовые поля для поиска
- ✓ Есть числовые поля (цена и т.д.)
Этап 2: Подготовьте схему AACsearch
Сопоставьте типы Elasticsearch ↔ AACsearch
Когда вы экспортируете из Elasticsearch, нужно преобразовать типы полей:
| Elasticsearch | AACsearch | Описание |
|---|---|---|
text | string | Полнотекстовый поиск |
keyword | string | Фасеты и фильтры |
integer | int32 | Числовой фильтр |
long | int64 | Большие числа |
float | float | Числовой с дробной частью |
double | float | Высокая точность |
boolean | bool | Да/нет фильтр |
date | string | Дата в формате ISO |
geo_point | geopoint | Поиск по расстоянию |
nested | object[] | Массив объектов |
Создайте индекс в AACsearch
- Откройте панель управления app.aacsearch.com
- Перейдите в Поиск → Индексы → Новый индекс
- Дайте название (например, "Товары")
- Нажмите Создать
Нажимайте Редактировать схему и добавьте поля:
Для каждого поля:
- Название поля (как в Elasticsearch)
- Тип (из таблицы выше)
- Отметьте Фасет если это фильтр
- Отметьте Сортировка если можно сортировать по этому полю
Пример:
Поле: title | Тип: string | Фасет: ✓
Поле: price | Тип: float | Фасет: ✗ | Сортировка: ✓
Поле: category | Тип: string | Фасет: ✓
Поле: created_at | Тип: string | Фасет: ✗ | Сортировка: ✓Этап 3: Загрузите товары
Подготовка файла
Если вы экспортировали одну строку JSON с массивом, преобразуйте в правильный формат:
# Если экспорт выглядит как массив массивов, преобразуйте
cat elasticsearch-export.json | jq -s '.' > aacsearch-import.jsonЗагрузка через панель управления
Для большинства сайтов это самый простой способ:
- В панели AACsearch перейдите в Поиск → ваш индекс → Импорт
- Нажмите Загрузить JSON
- Выберите файл
- Нажмите Импортировать
Статус будет обновляться в реальном времени.
Загрузка через API
Для больших объемов:
curl -X POST "https://app.aacsearch.com/api/v1/indexes/your-index-slug/documents:batch" \
-H "Authorization: Bearer YOUR_ADMIN_KEY" \
-H "Content-Type: application/json" \
-d @aacsearch-import.jsonПроверка
После загрузки:
- В панели → Поиск → ваш индекс → Статус
- Проверьте количество товаров
- Попробуйте поиск — введите название товара
Этап 4: Обновите код приложения
Замена Elasticsearch клиента на AACsearch
Раньше (Elasticsearch):
const { Client } = require('@elastic/elasticsearch');
const client = new Client({ node: 'http://localhost:9200' });
// Поиск
const result = await client.search({
index: 'your_index',
body: {
query: {
multi_match: {
query: 'red shoes',
fields: ['title', 'description']
}
},
aggs: {
categories: { terms: { field: 'category' } }
}
}
});Теперь (AACsearch):
const search = new AacsearchWidget.Search({
baseUrl: 'https://app.aacsearch.com',
apiKey: 'ss_search_YOUR_KEY',
indexSlug: 'your_index'
});
// Поиск
const result = await search.search({
q: 'red shoes',
facetBy: ['category']
});Сопоставление запросов Elasticsearch ↔ AACsearch
| Elasticsearch | AACsearch |
|---|---|
{ query: { match: { field: "text" }} } | { q: "text" } |
{ query: { term: { status: "active" }} } | { filterBy: "status:active" } |
{ aggs: { cats: { terms: {} }} } | { facetBy: ["category"] } |
{ sort: [{ price: "asc" }] } | { sortBy: "price:asc" } |
{ size: 20, from: 40 } | { perPage: 20, page: 3 } |
Примеры переписывания запросов
Пример 1: Простой поиск
// Elasticsearch
const es_result = await client.search({
index: 'products',
body: { query: { match: { title: 'shoes' } } }
});
// AACsearch
const aac_result = await search.search({ q: 'shoes' });Пример 2: Фасеты и фильтры
// Elasticsearch
const es_result = await client.search({
index: 'products',
body: {
query: { match: { title: 'shoes' } },
aggs: { category: { terms: { field: 'category' } } },
filter: { term: { in_stock: true } }
}
});
// AACsearch
const aac_result = await search.search({
q: 'shoes',
facetBy: ['category'],
filterBy: 'in_stock:true'
});Пример 3: Сортировка и пагинация
// Elasticsearch
const es_result = await client.search({
index: 'products',
body: {
query: { match: { title: 'shoes' } },
sort: [{ price: 'asc' }],
size: 20,
from: 40
}
});
// AACsearch
const aac_result = await search.search({
q: 'shoes',
sortBy: 'price:asc',
perPage: 20,
page: 3
});Этап 5: Тестирование и переключение
Перед переключением
Проверьте на локальном сервере:
- ✓ Поиск работает по основным словам
- ✓ Фасеты отображаются и работают
- ✓ Фильтры работают
- ✓ Сортировка работает
- ✓ Нет ошибок в консоли браузера
Переключитесь
- Обновите код на боевом сервере
- Очистите кэш браузера (Ctrl+Shift+Del)
- Откройте сайт и проверьте несколько поисков
После переключения
- Следите за логами — ошибок не должно быть
- Проверьте метрики в панели AACsearch → Аналитика
- Сравните результаты с Elasticsearch
План отката
Если что-то пойдет не так:
- Обновите код обратно на Elasticsearch (5 минут)
- Убедитесь, что поиск работает как раньше
- Свяжитесь с нами: support@aacsearch.com
Совет: не удаляйте индекс Elasticsearch на протяжении 1–2 недель после миграции.
Часто задаваемые вопросы
Q: Как сохранить историю поиска?
A: AACsearch не хранит историю автоматически. Если нужна история, сохраняйте запросы в вашей базе данных отдельно.
Q: Как работают сложные фильтры (AND, OR)?
A: AACsearch использует упрощенный язык фильтров:
- AND:
status:active AND price < 100 - OR:
category:(shoes OR boots)
Q: Поддерживается ли geo-поиск?
A: Да, тип geopoint поддерживает поиск по расстоянию.
Q: Могу ли я использовать оба сервиса одновременно?
A: Да, но это усложнит разработку. Рекомендуем полный переход.
Q: Что с аналитикой поиска?
A: AACsearch автоматически собирает аналитику (популярные запросы, нулевые результаты и т.д.). Посмотрите в панели → Аналитика.
Помощь и поддержка
- Справочник API
- Документация виджета
- Email: support@aacsearch.com
- Документация Elasticsearch: https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html