Raya Berova
6 janvier 2026
1️⃣ Contexte
2️⃣ Moteur de recherche - Théorie
3️⃣ Moteur de recherche ElasticSearch - Pratique
Ensemble de données avec des champs textes → Besoin de recherches textuelles rapides et efficaces
Solution : un moteur de recherche basé sur des index
ElasticSearch : logiciel pour l’indexation et la recherche de données.
Fait pour chercher des mots-clés dans des textes.
Utilisation en pratique avec Python : packages elasticsearch et elasticsearch-dsl.
Mais également utilisable avec Java.
1️⃣ Contexte
2️⃣ Moteur de recherche - Théorie
3️⃣ Moteur de recherche ElasticSearch - Pratique
Exemple
| idVoie | nom de voie |
|---|---|
| A | du general leclerc |
| B | du general charles de gaulle |
| C | du point du jour |
| D | verdier |
| E | des cours |
Pour chaque nom de voie du référentiel, compter le nombre de mots qui sont retrouvés dans l’adresse recherchée : les matchs 🎯.
Exemple : score avec tokenizer “mot” de “45 avenue du general charles de gaulle”
| idVoie | nom de voie | score |
|---|---|---|
| A | du general leclerc | 2 |
| B | du general charles de gaulle | 5 |
| C | du point du jour | 2 |
| D | verdier | 0 |
| E | des cours | 0 |
Tokenizer = façon de découper le texte recherché et ciblé.
Pour retourner la voie la plus pertinente, on construit un score pour chaque voie : \[ score_{voie} = \sum_{\text{∀m} \in \text{M}} {nb\_occurrence}_m \]
m = mot.
M = ensemble des mots de l’adresse recherchée.
Dans une grande base de données, c’est extrêmement long.
Exemple
| idVoie | nom de voie |
|---|---|
| A | du general leclerc |
| B | du general charles de gaulle |
| C | du point du jour |
| D | verdier |
| E | des cours |
| mot | occurrences |
|---|---|
| general | {“A”: 1, “B”: 1} |
| jour | {“C”: 1} |
| du | {“A”: 1, “B”: 1, “C”: 2} |
| cours | {“E”: 1} |
| … | … |
Comptage direct ⚡ des occurrences de chaque mot de la base par idVoie.
Contourner les petites fautes d’orthographes : fuzziness.
Pour matcher 🎯 deux mots avec une fuzziness de niveau 1 = corriger l’un des mots :
Il est possible de comparer deux textes, deux n-grams ou n’importe quel autre groupe de caractères.
Prendre en compte les correspondances partielles : chaque mot est découpé en sous-chaînes de n caractères consécutifs.
Exemple de découpage en 3-grams de caractères du texte “avenue verdier” :
ave, ven, enu, nue, ver, erd, rdi, die, ier
Si un mot est inférieur à la taille n, il n’aura pas de découpage en n-grams → pas présent dans l’index inversé n-gram.
Exemple
| idVoie | nom de voie |
|---|---|
| A | du general leclerc |
| B | du general charles de gaulle |
| C | du point du jour |
| D | verdier |
| E | des cours |
| 3-gram | occurrences |
|---|---|
| gen | {“A”: 1, “B”: 1} |
| cha | {“B”: 1} |
| our | {“C”: 1, “E”: 1} |
| oin | {“C”: 1} |
| … | … |
Score pour chaque voie : \[ score_{voie} = \sum_{\text{∀ngram} \in \text{N}} {nb\_occurrence}_{ngram} \]
N = ensemble des n-grams de l’adresse recherchée.
\[ \downarrow \text{taille n-grams} \Rightarrow \text{taille index inversé} \uparrow \Rightarrow \text{temps de recherche} \uparrow \]
Le score global va donc combiner la somme des matchs 🎯 au niveau :
Il est possible de donner plus ou moins d’importance à ces différents niveaux de matchs 🎯.
Requête 🔍 pour retrouver la voie :
À chaque match 🎯, le score va ⇡ en fonction du boost 🚀 associé.
| Variable | Tokenizer | Fuzzi 1 | Boost 🚀 |
|---|---|---|---|
| Nom de voie | Mot | ✅ | 15 |
| Type de voie | Mot | ✅ | 5 |
| Nom de voie | 3 à 5-grams | ❌ | 1 |
Ex boost 200 : “3 rue du genral de gaulle” ⊃ “du general de gaulle”
\[ score_{voie} = \sum_{\text{∀n} \in \text{N}} \sum_{\text{∀t} \in \text{n}} boost_{n}*{nb\_occurrence}_{t} \]
N = ensemble des niveaux (niveau chaîne complète fuzzi, niveau mot fuzzi…).
n = niveau.
t = token, sous-chaîne (un mot, un 3-grams…).
1️⃣ Contexte
2️⃣ Moteur de recherche - Théorie
3️⃣ Moteur de recherche ElasticSearch - Pratique
Trois éléments clés d’un index Elasticsearch :
Les mappings et les settings sont définis dans des fichiers JSON.
Les mappings décrivent :
Il est possible d’appliquer plusieurs traitements à une même variable et de différencier les traitements appliqués :
Variable : nom de voie
| Traitement de la variable | Tokenizer | Données recherchées | Données indexées |
|---|---|---|---|
| Entier | non | analyze_entier_input | analyze_entier_output |
| Mot | mot | analyze_mot_input | analyze_mot_output |
| 3-gram | 3-gram | analyze_3_gram_input | analyze_3_gram_output |
👉 Pour chaque type de traitement, un index spécifique est créé.
Les settings définissent la manière dont les textes sont :