🛢️Parcours Fioul GroupéMongoDB · Chapitre 12
Accueil › MongoDB › Chapitre 12
Chapitre 12 / 17

Les recherches textuelles

Au-delà du $regex (chapitre 4), MongoDB propose une vraie recherche plein-texte : on crée un index texte, puis on interroge avec $text. C'est ce qui alimente une barre de recherche.

1 Notion

$regex vs recherche plein-texte

$regex cherche un motif exact dans une chaîne (bien pour « commence par »). La recherche plein-texte découpe le texte en mots, ignore la casse et les mots vides, gère les racines : idéale pour « chercher des mots dans une description ».

2 Étape

Créer un index texte

La recherche plein-texte exige un index de type text, sur un ou plusieurs champs. Une collection ne peut avoir qu'un seul index texte (mais couvrant plusieurs champs).

db.campagnes.createIndex({ description: "text", zone: "text" })

// préciser la langue (mots vides, racines) :
db.campagnes.createIndex(
  { description: "text" },
  { default_language: "french" }
)
3 Requête

Rechercher avec $text

On interroge l'index texte avec l'opérateur $text et $search.

db.campagnes.find({ $text: { $search: "chauffage hiver" } })

Cette requête renvoie les campagnes contenant « chauffage » ou « hiver » (dans les champs indexés en texte).

4 Notion

Le score de pertinence

Chaque résultat reçoit un score de pertinence, qu'on récupère via $meta pour trier du plus pertinent au moins pertinent.

db.campagnes.find(
  { $text: { $search: "chauffage hiver" } },
  { score: { $meta: "textScore" } }
).sort({ score: { $meta: "textScore" } })
5 Requête

Phrases exactes & exclusion

On affine la recherche : guillemets pour une phrase exacte, tiret pour exclure un mot.

// contient la phrase exacte "commande groupée"
{ $search: "\"commande groupée\"" }

// contient "fioul" mais PAS "gaz"
{ $search: "fioul -gaz" }
6 Notion

Limites & alternative

La recherche $text couvre les besoins simples. Pour de la recherche avancée (fautes de frappe, pertinence fine, facettes), MongoDB propose Atlas Search (basé sur Lucene), disponible sur l'hébergement Atlas.

🛢️ Sur le projet Fioul Groupé

Ajoute un champ description aux campagnes et un index texte en french. La barre de recherche de l'appli enverra le texte saisi à un endpoint qui fera un $text/$search, trié par score. C'est un bon exercice de bout en bout : saisie Flutter → endpoint Spring → requête texte MongoDB.

Ce qu'il faut retenir du chapitre
  • $regex = motif exact ; recherche plein-texte = mots, casse et racines.
  • Un index text (un seul par collection), avec default_language.
  • $text + $search ; tri par $meta: "textScore".
  • Phrase exacte entre guillemets, exclusion avec -mot. Aller plus loin : Atlas Search.
← Chapitre 11