AACsearch
Руководства по миграции

Переход с Elasticsearch на AACsearch

Пошаговое руководство по переносу поиска с Elasticsearch на AACsearch. Без управления серверами, без настройки кластеров.

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

Почему переходить

ElasticsearchAACsearch
Нужно управлять серверомОблако — забейте о сервере
Сложная настройкаПросто и быстро
Нужно следить за дискомМасштабируется автоматически
Платите за мощностьПлатите за поиски и товары

Обзор переноса

ЭтапДействиеВремя
1Экспортируйте товары10 мин
2Создайте индекс в AACsearch10 мин
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, нужно преобразовать типы полей:

ElasticsearchAACsearchОписание
textstringПолнотекстовый поиск
keywordstringФасеты и фильтры
integerint32Числовой фильтр
longint64Большие числа
floatfloatЧисловой с дробной частью
doublefloatВысокая точность
booleanboolДа/нет фильтр
datestringДата в формате ISO
geo_pointgeopointПоиск по расстоянию
nestedobject[]Массив объектов

Создайте индекс в AACsearch

  1. Откройте панель управления app.aacsearch.com
  2. Перейдите в Поиск → Индексы → Новый индекс
  3. Дайте название (например, "Товары")
  4. Нажмите Создать

Нажимайте Редактировать схему и добавьте поля:

Для каждого поля:

  1. Название поля (как в Elasticsearch)
  2. Тип (из таблицы выше)
  3. Отметьте Фасет если это фильтр
  4. Отметьте Сортировка если можно сортировать по этому полю

Пример:

Поле: title       | Тип: string  | Фасет: ✓
Поле: price       | Тип: float   | Фасет: ✗ | Сортировка: ✓
Поле: category    | Тип: string  | Фасет: ✓
Поле: created_at  | Тип: string  | Фасет: ✗ | Сортировка: ✓

Этап 3: Загрузите товары

Подготовка файла

Если вы экспортировали одну строку JSON с массивом, преобразуйте в правильный формат:

# Если экспорт выглядит как массив массивов, преобразуйте
cat elasticsearch-export.json | jq -s '.' > aacsearch-import.json

Загрузка через панель управления

Для большинства сайтов это самый простой способ:

  1. В панели AACsearch перейдите в Поиск → ваш индекс → Импорт
  2. Нажмите Загрузить JSON
  3. Выберите файл
  4. Нажмите Импортировать

Статус будет обновляться в реальном времени.

Загрузка через 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

Проверка

После загрузки:

  1. В панели → Поиск → ваш индекс → Статус
  2. Проверьте количество товаров
  3. Попробуйте поиск — введите название товара

Этап 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

ElasticsearchAACsearch
{ 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: Тестирование и переключение

Перед переключением

Проверьте на локальном сервере:

  1. ✓ Поиск работает по основным словам
  2. ✓ Фасеты отображаются и работают
  3. ✓ Фильтры работают
  4. ✓ Сортировка работает
  5. ✓ Нет ошибок в консоли браузера

Переключитесь

  1. Обновите код на боевом сервере
  2. Очистите кэш браузера (Ctrl+Shift+Del)
  3. Откройте сайт и проверьте несколько поисков

После переключения

  1. Следите за логами — ошибок не должно быть
  2. Проверьте метрики в панели AACsearch → Аналитика
  3. Сравните результаты с Elasticsearch

План отката

Если что-то пойдет не так:

  1. Обновите код обратно на Elasticsearch (5 минут)
  2. Убедитесь, что поиск работает как раньше
  3. Свяжитесь с нами: 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 автоматически собирает аналитику (популярные запросы, нулевые результаты и т.д.). Посмотрите в панели → Аналитика.

Помощь и поддержка

On this page