$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 ».
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" }
)
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).
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" } })
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" }
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.
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.
$regex= motif exact ; recherche plein-texte = mots, casse et racines.- Un index
text(un seul par collection), avecdefault_language. $text+$search; tri par$meta: "textScore".- Phrase exacte entre guillemets, exclusion avec
-mot. Aller plus loin : Atlas Search.