Caractères génériques et Regex
Si vous avez une recherche très spécifique ou complexe à effectuer, et que les recherches complexes ne donnent pas les résultats escomptés, vous pouvez essayer d'utiliser des caractères génériques ou des expressions régulières (Regex). Ces outils sont beaucoup plus complexes, et la courbe d'apprentissage est élevée, mais ils vous permettent d'effectuer des recherches extrêmement précises. Par exemple, vous pouvez rechercher des répétitions de mots, des fragments de mots ou même des séquences de caractères d'une certaine taille.
Expressions avec caractères génériques
Les expressions avec caractères génériques vous permettent de masquer des caractères individuels ou des séquences de caractères à l'intérieur des mots. Par exemple, si vous souhaitez trouver toutes les occurrences de "test" et de "texte". Vous pourriez chercher texte test
(ou texte OR test
), et cela vous donnerait ce que vous voulez, mais vous pouvez aussi utiliser le caractère générique ?
et chercher te?t
à la place. Cela trouvera tous les mots qui commencent par "te", plus un caractère qui peut être n'importe quoi, et qui se terminent par "t". Cela trouverait aussi "teat".
En plus de ?
qui représente un et un seul caractère, vous pouvez également utiliser *
qui représente n'importe quel caractère, zéro, une ou plusieurs fois. Si vous recherchez te*t
, vous êtes donc susceptible de trouver beaucoup plus de mots, parmi eux "test" et "texte", mais aussi "tempête", "testament" et "tente".
Vous n'avez pas besoin de signaler d'une manière quelconque que vous effectuez une recherche avec caractère générique : il suffit d'inclure ?
ou *
.
Un caractère générique ne peut pas apparaître en premier dans une expression de recherche, donc vous ne pouvez pas trouver "Hamlet" avec ?amlet
ou *let
. Si vous souhaitez effectuer des recherches de ce type, vous devez utiliser une expression régulière.
Expressions régulières
Les expressions régulières sont aussi appelées "regex" ou "regexp". Ce sont des outils très puissants pour rechercher du texte (et aussi pour remplacer du texte, mais ce n'est pas pertinent ici). Lucene ne supporte qu'une gamme limitée d'opérateurs regex, mais ils devraient suffire pour la plupart des utilisations.
Vous mettez le moteur de recherche en mode regex en encadrant votre terme de recherche avec des barres obliques. Par exemple, vous chercheriez /.{3}let/
pour trouver "Hamlet" (mais aussi, par exemple, "fillet").
Correspondance avec n'importe quel caractère
Le point .
peut être utilisé pour représenter n'importe quel caractère (c'est la même chose que le caractère générique ?
).
Pour récupérer la chaîne "serpent", les expressions suivantes peuvent être utilisées :
/s.rpent/
/.erpen./
Un-ou-plus
Le signe plus "+"
peut être utilisé pour répéter le motif précédent le plus court une ou plusieurs fois.
Pour récupérer la chaîne "déssert", l'expression suivante peut être utilisée :
/dés+ert/
Zéro-ou-plus
L'astérisque *
peut être utilisé pour correspondre au motif précédent le plus court zéro-ou-plus fois. Notez que cela s'applique à ce qui précède l'astérisque - le caractère générique *
représente un caractère en lui-même (un caractère générique *
équivaut à un regex .*
).
Pour récupérer à la fois les chaînes "poisson" et "poison" (ainsi que "poivron" et "poinçon", et ainsi de suite), l'expression suivante peut être utilisée :
/poi*on/
Zero-or-one
Le point d'interrogation ?
rend le motif précédent le plus court optionnel. Il correspond à zéro ou une fois. Notez que dans les recherches avec caractères génériques de Lucene, ?
représente un caractère en lui-même ; dans les recherches regex, le point d'interrogation quantifie le caractère immédiatement précédent (ou le motif).
Pour récupérer les chaînes "poisson" et "poison", l'expression suivante peut être utilisée :
/poiss?on/
Min-à-max
Les accolades {}
peuvent être utilisées pour spécifier un nombre minimum et (facultativement) un nombre maximum de répétitions du motif précédent le plus court. Les formes autorisées sont :
- {5} répétez exactement 5 fois
- {2,5} répétez au moins deux fois et au plus 5 fois
- {2,} répétez au moins deux fois
Pour récupérer la chaîne "poisson", l'expression suivante peut être utilisée :
/pois{2}on/
/pois{2,}on/
/pois{2,5}on/
Regroupement
Parentheses ()
can be used to form sub-patterns. The quantity operators listed above operate on the shortest previous pattern, which can be a group.
Pour récupérer la chaîne "poisson", l'expression suivante peut être utilisée :
/poi(..)+on/
/poi(ss)*on/
/poi(ss)?on/
Alternative
Le symbole pipe |
agit comme un opérateur OU. La correspondance réussira si le motif à gauche ou à droite correspond. Cela équivaut bien sûr à l'opérateur OU dans la syntaxe Lucene standard. |
acts as an OR operator. The match will succeed if the pattern on either the left-hand side or the right-hand side matches. This is of course equivalent to the OR operator in standard Lucene syntax.
Pour récupérer les chaînes "proportions" et "préparations", l'expression suivante peut être utilisée :
/(prépara|propor)tions/
Classes de caractères
Les classes de caractères sont très importantes, car elles vous permettent de masquer les variations avec plus de contrôle que celui offert par les caractères génériques. Vous pouvez ainsi les utiliser pour trouver des mots même s'ils sont écrits différemment, par exemple s'ils ont soit "e" soit "o" à une certaine position ou s'ils ont "a" et "e" à une certaine position.
Les plages de caractères potentiels peuvent être représentées comme des classes de caractères en les encadrant entre crochets []
. Un accent circonflexe ^
en tête de liste annule la classe de caractères, c'est-à-dire que tous les caractères autres que ceux qui suivent sont indiqués.
Les formes autorisées sont :
- [abc] 'a' ou 'b' ou 'c'
- [a-c] 'a' à 'c', c'est-à-dire 'a' ou 'b' ou 'c'
- [-abc] 'b' ou 'c', mais pas 'a'
- [abc\-] 'a' ou 'b' ou 'c' ou '-'
- [^abc] tout caractère sauf 'a' ou 'b' ou 'c'
- [^a-c] tout caractère sauf 'a' ou 'b' ou 'c'
- [^-abc] tout caractère sauf '-' ou 'a' ou 'b' ou 'c'
Notez que le tiret -
indique une plage de caractères, sauf s'il est le premier caractère ou s'il est échappé avec un antislash.
L'accent circonflexe ^
annule les caractères qui le suivent.
Pour récupérer la chaîne "poisson", l'expression suivante pourrait être utilisée :
/poi[qrstu]+on/
/poi[qrstu]*on/
/poia[qrstu]?on/
/poi[a-t]*on/
/poia[^aeiou]on/
Les possibilités sont sans fin.
Il existe de nombreux tutoriels sur les expressions rationnelles. Vous en trouverez un bon à l'adresse suivante : regexlearn.com.
La définition exacte des possibilités de regex dans Lucene est disponible à l'adresse lucene.apache.org.