Миграция из Typesense
Пошаговое руководство по переходу с Typesense на AACsearch Engine — миграция индексов, API-ключей и виджетов поиска.
Миграция из Typesense
Это руководство поможет вам перейти с Typesense на AACsearch Engine. Процесс разработан для минимального времени простоя и занимает всего несколько часов.
Обзор миграции
| Шаг | Что вы делаете | Время |
|---|---|---|
| 1 | Экспортируете индекс из Typesense | ~5 минут |
| 2 | Создаёте индекс в AACsearch | ~5 минут |
| 3 | Импортируете данные | ~10 минут |
| 4 | Настраиваете фильтры и синонимы | ~15 минут |
| 5 | Обновляете API-ключи | ~10 минут |
| 6 | Обновляете фронтенд | ~30 минут |
| 7 | Переключаете на новый эндпоинт | ~5 минут |
Шаг 1: Экспортируйте индекс из Typesense
Используйте CLI Typesense или API:
# Экспортируйте документы в JSON
curl "http://localhost:8108/collections/products/documents/export" \
-H "X-TYPESENSE-API-KEY: your_api_key" \
> typesense-export.jsonИли используйте Typesense Python-клиент:
import typesense
import json
client = typesense.Client({
'nodes': [{'host': 'localhost', 'port': '8108', 'protocol': 'http'}],
'api_key': 'your_api_key',
'connection_timeout_seconds': 2
})
collection = client.collections['products'].retrieve()
documents = client.collections['products'].documents.export()
with open('typesense-export.json', 'w') as f:
f.write(documents)Шаг 2: Создайте индекс в AACsearch
В панели AACsearch или через API:
curl -X POST "https://app.aacsearch.com/api/v1/indexes" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "products",
"fields": [
{"name": "id", "type": "string", "indexing": true},
{"name": "title", "type": "string", "indexing": true},
{"name": "description", "type": "string", "indexing": true},
{"name": "price", "type": "float", "sort": true},
{"name": "category", "type": "string", "facet": true},
{"name": "rating", "type": "float", "sort": true},
{"name": "in_stock", "type": "bool", "facet": true}
]
}'Шаг 3: Импортируйте данные
Преобразуйте экспортированные данные и загрузите их:
# Экспортированные документы обычно идут в формате JSON Lines
# Просто импортируйте их напрямую:
curl -X POST "https://app.aacsearch.com/api/v1/indexes/products/documents/batch" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d @typesense-export.jsonИли преобразуйте в нужный формат:
import json
# Прочитайте экспортированные документы
with open('typesense-export.json', 'r') as f:
lines = f.readlines()
documents = [json.loads(line) for line in lines]
# Убедитесь, что каждый документ имеет поле "id"
for doc in documents:
if 'id' not in doc:
doc['id'] = str(doc.get('object_id', '')) # или другой уникальный идентификатор
# Сохраните в JSON
with open('import-data.json', 'w') as f:
json.dump(documents, f)
# Загрузите
import requests
with open('import-data.json', 'r') as f:
response = requests.post(
'https://app.aacsearch.com/api/v1/indexes/products/documents/batch',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
json=json.load(f)
)
print(response.json())Шаг 4: Настройте параметры поиска
Фильтры (facets)
Преобразуйте параметры из Typesense:
| Typesense | AACsearch | Заметки |
|---|---|---|
facet_by: ["category"] | "facet": true на поле | Фильтруемое поле |
group_by: ["brand"] | Массив строк "type": "string[]" | Группировка результатов |
Синонимы
Экспортируйте синонимы из Typesense и импортируйте в AACsearch:
# Экспортируйте синонимы из Typesense
curl "http://localhost:8108/synonyms" \
-H "X-TYPESENSE-API-KEY: your_api_key" \
> typesense-synonyms.json
# Импортируйте в AACsearch
curl -X POST "https://app.aacsearch.com/api/v1/indexes/products/synonyms" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '[
{"synonyms": ["спортивная обувь", "кроссовки", "кеды"]},
{"synonyms": ["телефон", "смартфон", "мобильник"]},
{"synonyms": ["ноутбук", "лэптоп", "компьютер"]}
]'Сортировка по релевантности
Typesense использует формулу textMatchScore * popularity. AACsearch имеет встроенные стратегии ранжирования:
# Обновите правила ранжирования
curl -X PUT "https://app.aacsearch.com/api/v1/indexes/products/ranking" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"sortByFields": [
{"field": "relevance", "order": "desc"},
{"field": "rating", "order": "desc"},
{"field": "price", "order": "asc"}
]
}'Шаг 5: Обновите API-ключи
Создайте новые API-ключи в AACsearch:
# Создайте ключ поиска (публичный)
curl -X POST "https://app.aacsearch.com/api/v1/keys" \
-H "Authorization: Bearer YOUR_ADMIN_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Search API Key",
"scope": "search",
"indexes": ["products"]
}'
# Результат:
# {
# "key": "ss_search_...",
# "keyHash": "..."
# }Важно: API-ключ поиска (публичный) можно безопасно встраивать на клиент. Не используйте админ-ключи на клиенте.
Шаг 6: Обновите фронтенд
JavaScript
// Старый код Typesense
const typesense = new Typesense.SearchClient({
nodes: [{
host: 'localhost',
port: 8108,
protocol: 'http'
}],
apiKey: 'your_api_key',
connectionTimeoutSeconds: 2
});
// Новый код AACsearch
const searchClient = new AACSearchClient({
apiKey: 'ss_search_...',
baseURL: 'https://app.aacsearch.com'
});
// Поиск
const results = await searchClient.search({
indexSlug: 'products',
query: 'кроссовки',
filters: { category: 'обувь', price: { lte: 10000 } },
limit: 20
});Python
import aac_search
client = aac_search.AACSearchClient(
api_key='ss_search_...',
base_url='https://app.aacsearch.com'
)
results = client.search(
index_slug='products',
query='кроссовки',
filters={'category': 'обувь', 'price': {'lte': 10000}},
limit=20
)
for hit in results['hits']:
print(hit['title'], hit['price'])cURL
curl -X POST "https://app.aacsearch.com/api/v1/indexes/products/search" \
-H "Authorization: Bearer ss_search_..." \
-H "Content-Type: application/json" \
-d '{
"query": "кроссовки",
"filters": {"category": "обувь", "price": {"lte": 10000}},
"limit": 20
}'Шаг 7: Переключитесь на новый эндпоинт
Обновите URL в приложении
// Раньше
const searchURL = 'http://localhost:8108/collections/products/documents/search';
// Теперь
const searchURL = 'https://app.aacsearch.com/api/v1/indexes/products/search';Обновите виджет поиска
<!-- Старый Typesense виджет -->
<script src="https://cdn.jsdelivr.net/npm/typesense-instantsearch-adapter@2/dist/typesense-instantsearch-adapter.min.js"></script>
<!-- Новый AACsearch виджет -->
<div id="aac-search"></div>
<script
src="https://app.aacsearch.com/api/widget/widget.js"
data-api-key="ss_search_..."
data-index-slug="products"
data-container="#aac-search">
</script>Проверка миграции
-
Количество документов: проверьте, что все документы загружены
curl "https://app.aacsearch.com/api/v1/indexes/products" \ -H "Authorization: Bearer YOUR_API_KEY" -
Поиск работает: попробуйте поискать несколько товаров
curl -X POST "https://app.aacsearch.com/api/v1/indexes/products/search" \ -H "Authorization: Bearer ss_search_..." \ -d '{"query": "кроссовки"}' -
Фильтры работают: проверьте фильтры по категориям и цене
-
Производительность: сравните скорость старого и нового поиска
Откат на Typesense
Если возникли проблемы, вы можете вернуться на Typesense:
// Обновите URL обратно на Typesense
const searchURL = 'http://localhost:8108/collections/products/documents/search';
// Очистите кэш браузера (Ctrl+Shift+Delete)Часто задаваемые вопросы
Q: Все ли документы загрузились?
A: Проверьте в панели AACsearch → Поиск → Статистика. Там должно быть столько же документов, сколько в Typesense.
Q: Почему поиск работает по-другому?
A: У AACsearch и Typesense разные алгоритмы ранжирования. Это нормально. Вы можете отрегулировать сортировку через настройки индекса.
Q: Нужна ли оптимизация?
A: AACsearch автоматически оптимизирует индексы. Вам не нужно ничего делать.
Q: Как быстро загружаются новые документы?
A: Новые документы индексируются в течение несколько секунд.
Q: Поддерживает ли AACsearch иерархические фильтры?
A: Да, используйте массивы строк для иерархических фильтров (например, ["Женская обувь", "Кроссовки"]).