AACsearch
Guides de migration

Migration depuis Elasticsearch

Guide étape par étape pour migrer votre recherche d'Elasticsearch vers AACsearch Engine — mappage d'index, réindexation et traduction de requêtes.

Migration depuis Elasticsearch

Ce guide vous accompagne dans la migration de votre infrastructure de recherche d'Elasticsearch vers AACsearch Engine. AACsearch offre une qualité de recherche comparable avec un modèle opérationnel considérablement plus simple — pas de gestion de cluster, pas de réglage de shards, pas de dimensionnement de heap JVM.

Aperçu de la migration

ÉtapeCe que vous faitesDurée
1Exporter le mappage de votre index Elasticsearch~5 minutes
2Créer un index AACsearch avec un schéma traduit~10 minutes
3Exporter et réindexer les documents~15 minutes
4Porter les requêtes de recherche~30 minutes
5Mettre à jour le code de l'application~30 minutes
6Basculer le trafic et vérifier~10 minutes

Étape 1 : Exporter le mappage Elasticsearch

# Get index mapping
curl "http://localhost:9200/YOUR_INDEX_NAME/_mapping" | jq . > es-mapping.json

# Get index settings
curl "http://localhost:9200/YOUR_INDEX_NAME/_settings" | jq . > es-settings.json

Comprenez vos types de champ — chaque type Elasticsearch correspond à un équivalent AACsearch.

Étape 2 : Créer un index AACsearch avec un schéma traduit

Référence de traduction de mappage

Type ElasticsearchType AACsearchRemarques
textstringRecherche en texte intégral
keywordstringUtiliser pour le filtrage, le facettage
integer, longint32, int64Filtres de plage numérique
float, doublefloatTriable, filtres de plage
booleanboolFiltre de correspondance exacte
dateint64Stocker comme timestamp Unix
geo_pointgeopointRecherche par distance/rayon géographique
nestedobject[]Tableau d'objets
objectobjectObjet unique
completionstring (auto)Les requêtes de suggestion utilisent les champs string

Créez l'index :

curl -X POST "https://app.aacsearch.com/api/projects/YOUR_PROJECT_ID/indexes" \
  -H "Authorization: Bearer *** \
  -H "Content-Type: application/json" \
  -d '{
    "slug": "your_index",
    "displayName": "Your Index",
    "fields": [
      {"name": "id", "type": "string"},
      {"name": "title", "type": "string"},
      {"name": "content", "type": "string"},
      {"name": "price", "type": "float", "sort": true},
      {"name": "category", "type": "string", "facet": true},
      {"name": "published_at", "type": "int64", "sort": true},
      {"name": "in_stock", "type": "bool"},
      {"name": "location", "type": "geopoint"}
    ],
    "defaultSortingField": "published_at"
  }'

Conseil : Contrairement à Elasticsearch, AACsearch vous oblige à définir le schéma à l'avance. Utilisez l'export _source pour découvrir tous les noms de champs et leurs types avant de créer l'index.

Étape 3 : Exporter et réindexer les documents

Export par scroll depuis Elasticsearch

#!/bin/bash
ES_URL="http://localhost:9200"
INDEX="your_index"

# Initialize scroll
SCROLL_ID=$(curl -s "$ES_URL/$INDEX/_search?scroll=1m" \
  -H "Content-Type: application/json" \
  -d '{"size": 1000, "_source": true}' | jq -r '._scroll_id')

echo "[]" > export.json
while true; do
  RESULT=$(curl -s "$ES_URL/_search/scroll" \
    -H "Content-Type: application/json" \
    -d "{\"scroll\": \"1m\", \"scroll_id\": \"$SCROLL_ID\"}")

  HITS=$(echo "$RESULT" | jq '.hits.hits')
  COUNT=$(echo "$HITS" | jq 'length')

  if [ "$COUNT" -eq "0" ]; then break; fi

  # Transform to AACsearch format
  echo "$HITS" | jq '[.[] | {id: ._id} + ._source]' > batch.json
  cat batch.json | python3 -c "
import json,sys
docs=json.load(sys.stdin)
with open('export.json') as f: existing=json.load(f)
existing.extend(docs)
with open('export.json','w') as f: json.dump(existing,f)
"

  SCROLL_ID=$(echo "$RESULT" | jq -r '._scroll_id')
done

# Clear scroll
curl -X DELETE "$ES_URL/_search/scroll" \
  -H "Content-Type: application/json" \
  -d "{\"scroll_id\": \"$SCROLL_ID\"}"

Importer dans AACsearch

# Batch import (up to 5000 docs per request)
split -l 1000 export.json batch-
for f in batch-*; do
  curl -X POST "https://app.aacsearch.com/api/indexes/YOUR_INDEX_ID/documents:batch" \
    -H "Authorization: Bearer *** \
    -H "Content-Type: application/json" \
    -d @$f
done

Étape 4 : Porter les requêtes de recherche

Référence de traduction des requêtes

DSL ElasticsearchParamètre AACsearch
match / multi_match sur qq
Filtre termfilterBy: "field:=value"
Filtre rangefilterBy: "field:>=value && field:<=value"
bool must/shouldCombiner avec la syntaxe AND/OR de filterBy
sortsortBy: "field:asc"
aggs (termes simples)facetBy: "field"
from / sizepage / perPage
highlighthighlightFields: "field1,field2"
suggestPOST /api/v1/indexes/:id/suggest
function_scoreUtiliser la configuration ranking ou sortBy: _eval(...)

Exemple : Porter une requête complexe

Elasticsearch :

GET /products/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "title": "laptop" }},
        { "match": { "description": "gaming" }}
      ],
      "filter": [
        { "term": { "category": "electronics" }},
        { "range": { "price": { "gte": 500, "lte": 3000 }}}
      ]
    }
  },
  "sort": [{ "price": "asc" }],
  "from": 0,
  "size": 20,
  "aggs": {
    "by_brand": { "terms": { "field": "brand" }},
    "price_range": { "stats": { "field": "price" }}
  }
}

Équivalent AACsearch :

curl -X POST "https://app.aacsearch.com/api/v1/indexes/products/search" \
  -H "X-API-Key: ss_search_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "q": "laptop gaming",
    "queryBy": "title,description",
    "filterBy": "category:=electronics && price:>=500 && price:<=3000",
    "sortBy": "price:asc",
    "page": 1,
    "perPage": 20,
    "facetBy": "brand"
  }'

Comparaison de la syntaxe des filtres

| Opération | Elasticsearch | AACsearch | | ------------------ | ------------------------- | ------------------------------- | --- | --------------- | | Égal à | term: {field: val} | field:=val | | Différent de | must_not term | field:!=val | | Supérieur à | range: {gt: val} | field:>val | | Inférieur ou égal | range: {lte: val} | field:<=val | | Plage | range: {gte: a, lte: b} | field:>=a && field:<=b | | ET | bool must | && entre filtres | | OU | bool should | | | entre filtres | | DANS | terms: {field: [...]} | field:=[val1,val2] | | Rayon géographique | geo_distance | location:(lat, lng, distance) |

Étape 5 : Mettre à jour le code de l'application

Remplacer le client Elasticsearch

Avant (Elasticsearch) :

import { Client } from "@elastic/elasticsearch";

const es = new Client({ node: "http://localhost:9200" });

const result = await es.search({
	index: "products",
	query: {
		match: { title: "laptop" },
	},
});

Après (AACsearch) :

import { SearchClient } from "@aacsearch/client";

const client = new SearchClient({
	baseUrl: "https://app.aacsearch.com",
	apiKey: "ss_search_YOUR_KEY",
	indexSlug: "products",
});

const result = await client.search({
	q: "laptop",
	queryBy: "title",
});

Étape 6 : Basculer le trafic

  1. Pointez votre application vers https://app.aacsearch.com
  2. Mettez à jour les clés API des identifiants Elasticsearch vers les jetons AACsearch
  3. Effectuez une comparaison côte à côte des résultats de recherche pour les requêtes clés
  4. Surveillez les taux d'erreur et la latence de recherche
  5. Décommissionnez votre cluster Elasticsearch (ou conservez-le comme réserve à chaud)

Ce que vous gagnez

AspectElasticsearchAACsearch
OpérationsGestion de cluster, réglage de shards, tuning JVMEntièrement géré, zéro opération
** Passage à l'échelle**Division manuelle des shards, rééquilibrageAutomatique
Haute disponibilitéCluster multi-nœud, réplicationIntégré, multi-région
Qualité de rechercheBM25 (configurable)Tolérant aux fautes de frappe, sensible à la proximité par défaut
AnalyticsNécessite Kibana + configuration supplémentaireTableaux de bord intégrés, analytics de requêtes
PrixInfrastructure + coûts opérationnelsBasé sur l'utilisation, prévisible
SécuritéFonctions de sécurité ElasticsearchClé API + jetons à portée + liste blanche IP

Référence d'équivalence API

FonctionnalitéElasticsearchAACsearch
Recherche en texte intégralmatch / multi_matchq + queryBy
Recherche filtréebool + filterfilterBy
Recherche facetéeaggsfacetBy
TrisortsortBy
Paginationfrom / sizepage / perPage
Recherche géographiquegeo_distanceFiltre geo dans filterBy
SynonymesFiltre de token de graphe de synonymesPUT /api/indexes/:id/synonyms
CurationRègles de requêtePUT /api/indexes/:id/curations
Suggestion_search avec suggestPOST /api/v1/indexes/:id/suggest
Recherche multiple_msearchPOST /api/v1/multi-search
AnalyticsKibana + BeatsAPI d'analytics intégrée

Besoin d'aide ?

On this page