1. Les types de champs #
Le bon type pour le bon usage.
Types #
| Type | Pour | Exemple |
|---|---|---|
text | Recherche plein texte (analysé) | Description d'un produit |
keyword | Filtres, tris, agrégations (valeur exacte) | Code pays, statut, identifiant |
long, double, scaled_float | Calculs, plages | Prix, durée |
date | Séries temporelles | @timestamp |
ip, geo_point | Adresses IP (plages CIDR), positions | client.ip, location |
nested | Tableaux d'objets interrogés objet par objet | Lignes d'une commande |
PUT products
{
"mappings": {
"dynamic": "strict",
"properties": {
"name": { "type": "text", "analyzer": "french", "fields": { "raw": { "type": "keyword" } } },
"sku": { "type": "keyword" },
"price": { "type": "scaled_float", "scaling_factor": 100 },
"lines": { "type": "nested", "properties": { "sku": { "type": "keyword" }, "qty": { "type": "integer" } } }
}
}
}Erreur Courante : Le mapping dynamique devine les types au premier document : une chaîne devienttext+keyword, un nombre écrit entre guillemets reste une chaîne. En production, définissez les mappings dans des templates et utilisezdynamic: strictouruntime.
2. L'analyse de texte #
Ce qui est vraiment indexé.
Analyseurs #
POST _analyze
{ "analyzer": "french", "text": "L'été arrive, les arrivées sont prévues." }
PUT articles
{
"settings": {
"analysis": {
"analyzer": {
"fr_custom": { "tokenizer": "standard",
"filter": [ "lowercase", "asciifolding", "french_elision", "french_stop", "french_stemmer" ] }
},
"filter": {
"french_elision": { "type": "elision", "articles_case": true, "articles": ["l", "d", "j", "qu", "c", "n", "s", "t", "m"] },
"french_stop": { "type": "stop", "stopwords": "_french_" },
"french_stemmer": { "type": "stemmer", "language": "light_french" }
}
}
}
}Bonne Pratique : Testez toujours un analyseur avec _analyze sur de vraies phrases : c'est le moyen le plus rapide de comprendre pourquoi une recherche ne trouve pas un document.