Correspondance de motifs
Dans les applications de recherche agentique, la recherche vectorielle et la correspondance de motifs de type « grep » se complètent souvent. La recherche vectorielle extrait les entités sémantiquement pertinentes, tandis que la correspondance de motifs affine ces résultats en fonction de structures de chaînes exactes, telles que les codes d’erreur, les préfixes de journaux, les domaines de messagerie, les chemins d’URL ou les identifiants.
Dans Milvus, vous pouvez exprimer ces contraintes de motif dans des filtres scalaires à l’aide de LIKE pour une correspondance simple avec des caractères génériques, et de =~ ou !~ pour les expressions régulières RE2. Vous pouvez combiner ces filtres avec query, search ou la recherche hybride.
Cette page décrit la correspondance de motifs dans les expressions de filtre scalaire utilisées par query, search et la recherche hybride. Ces expressions évaluent les valeurs des champs et ne modifient pas les tokens générés par un analyseur. Pour filtrer les tokens lors de l’analyse de texte, reportez-vous à la section Filtre d’analyseur Regex.
Les expressions de correspondance de motifs sont écrites dans le paramètre « filter ». Par exemple, la requête suivante correspond aux messages de journal contenant un code d’erreur tel que « E1001 » :
from pymilvus import MilvusClient
client = MilvusClient(uri="http://localhost:19530")
res = client.query(
collection_name="log_events",
filter='message =~ "E[0-9]{4}"',
output_fields=["message", "severity"],
)
Les exemples présentés sur cette page se concentrent sur l’expression attribuée à ` filter`. Vous pouvez utiliser la même syntaxe d’expression de filtrage dans les opérations Milvus qui acceptent un filtre scalaire, telles que ` query`, ` search` et la recherche hybride.
Types de champs pris en charge
La correspondance de motifs est disponible pour les valeurs de type chaîne de caractères.
| Cible | LIKE | =~ / !~ | Remarques |
|---|---|---|---|
VARCHAR champ | Oui | Oui | Cible typique pour la correspondance de motifs sur les champs de chaîne de caractères. |
JSON chemin avec type de conversion « VARCHAR » | Oui | Oui | La valeur du chemin JSON doit être une chaîne de caractères pour que les correspondances soient positives. Si vous créez un index sur le chemin JSON à des fins d'accélération, définissez json_cast_type="varchar". |
ARRAY<VARCHAR> élément | Oui | Oui | Permet de faire correspondre un élément spécifique par index, par exemple tags[0]. La correspondance de motif ne parcourt pas tous les éléments ; elle s’applique uniquement à l’élément situé à l’index spécifié. |
Cibles numériques, booléennes, vectorielles, de type « TEXT » ou autres cibles non «VARCHAR » | Non | Non | La correspondance de motif n’est disponible que pour les valeurs de type « VARCHAR », les chemins JSON se résolvant en chaînes de caractères ou les éléments indexés de type « ARRAY<VARCHAR> ». |
Choisissez LIKE ou une expression régulière
Choisissez l’opérateur le plus simple qui exprime le motif dont vous avez besoin.
Si vous avez besoin d’une correspondance exacte de chaîne, nous vous recommandons d’utiliser « == » plutôt que la correspondance de motif. N’utilisez « LIKE » ou « regex » que lorsque le filtre doit correspondre à un motif.
| Exigence | Opérateur recommandé | Exemple | Description |
|---|---|---|---|
| Égalité exacte de chaînes | == | status == "active" | Correspondance exacte de la chaîne « active ». |
| Correspondance simple par préfixe | LIKE | name LIKE "Prod%" | Correspond aux chaînes commençant par « Prod ». |
| Correspondance simple par suffixe | LIKE | filename LIKE "%.json" | Correspond aux chaînes se terminant par « .json ». |
| Correspondance simple « contient » | LIKE | description LIKE "%vector database%" | Recherche les valeurs contenant « vector database » n'importe où dans la chaîne. |
| Recherche d’un code structuré ou d’un motif de longueur fixe | =~ | code =~ "E[0-9]{4}" | Recherche les chaînes de caractères qui contiennent, en respectant la casse, « E » suivi de quatre chiffres, par exemple « E1001 ». |
| Correspondance de motif sans distinction de casse | =~ avec (?i) | message =~ "(?i)error" | Recherche « error », « ERROR » ou d’autres variantes de casse. |
| Exclure les valeurs correspondant à un motif d’expression régulière | !~ | message !~ "^DEBUG" | Exclut les chaînes commençant par DEBUG. |
Utilisez « LIKE » pour une correspondance simple avec des caractères génériques. Utilisez une expression régulière lorsque le motif nécessite des classes de caractères, des répétitions, des alternatives telles que « error|failed », des ancrages ou une correspondance sans distinction de casse.
Utiliser LIKE
L'opérateur « LIKE » sert à effectuer une correspondance simple avec des caractères génériques sur des valeurs de chaîne. Il ne prend en charge que les caractères génériques suivants :
| Caractère générique | Description |
|---|---|
% | Correspond à zéro ou plusieurs caractères. |
_ | Correspond à exactement un caractère. |
Modèles LIKE courants
Utilisez la position de % et _ pour contrôler l'emplacement du texte fixe dans la chaîne correspondante.
| Exigence | Modèle | Exemple de filtre |
|---|---|---|
| Commence par un préfixe | Prod% | filter = 'name LIKE "Prod%"' |
| Se termine par un suffixe | %.json | filter = 'filename LIKE "%.json"' |
| Contient une sous-chaîne | %vector% | filter = 'description LIKE "%vector%"' |
| Correspond à un caractère à une position fixe | AB_% | filter = 'code LIKE "AB_%"' |
Comportement de correspondance LIKE
Utilisez « LIKE » pour les correspondances de préfixe, de suffixe, de contenu et de caractère unique à position fixe. « LIKE » ne prend pas en charge les classes de caractères telles que « [0-9] », les alternatives telles que « error|failed », les nombres de répétitions tels que « {4} », les ancrages tels que « ^ » ou « $ », ni les indicateurs de sensibilité à la casse tels que « (?i) ». Utilisez les expressions régulières pour ces motifs.
Utilisez == pour une égalité exacte de la chaîne complète. N'utilisez LIKE que lorsque le filtre nécessite une correspondance avec des caractères génériques.
Échappement des caractères génériques dans un motif LIKE
Dans les motifs de type « LIKE », « % » correspond à zéro ou plusieurs caractères et « _ » correspond à exactement un caractère. Pour faire correspondre littéralement « % », « _ » ou « \ », échappez le caractère à l’aide d’une barre oblique inversée (\) :
name LIKE r"\%"correspond à la valeur littérale%.name LIKE r"\_%"correspond aux valeurs commençant par le caractère littéral «_».name LIKE r"\\%"correspond aux valeurs commençant par une barre oblique inversée littérale.
Les littéraux de chaîne brute, écrits sous la forme r"..." ou r'...', conservent les barres obliques inversées telles quelles dans les expressions de filtre Milvus. Ils sont recommandés pour les expressions « LIKE » et les motifs d’expressions régulières contenant des barres obliques inversées. Sans chaîne brute, les littéraux de chaîne ordinaires traitent toujours les séquences d’échappement avant l’évaluation du motif ; il peut donc être nécessaire d’ajouter des barres obliques inversées supplémentaires.
Utilisez les expressions régulièresCompatible with Milvus 3.0.x
Utilisez des filtres d’expressions régulières lorsque le motif nécessite des fonctionnalités d’expressions régulières telles que les classes de caractères, la répétition, l’alternance, les ancres ou la correspondance insensible à la casse. Milvus applique une expression régulière RE2 à une valeur de chaîne.
Le côté droit de =~ ou !~ doit être un littéral de chaîne.
| Opérateur | Signification | Exemple |
|---|---|---|
=~ | Correspond aux valeurs qui satisfont au motif d'expression régulière. | filter = 'message =~ "E[0-9]{4}"' |
!~ | Exclut les valeurs qui correspondent au motif d'expression régulière. | filter = 'message !~ "^DEBUG"' |
Utilisez des littéraux de chaîne bruts
Les littéraux de chaîne bruts sont recommandés pour les expressions régulières contenant des barres obliques inversées. Dans une chaîne brute, écrite sous la forme r"..." ou r'...', les barres obliques inversées sont transmises telles quelles au moteur d'expressions régulières. Cela évite l'échappement supplémentaire requis par les littéraux de chaîne ordinaires.
Par exemple :
filter = 'message =~ r"\d{4}-\d{2}-\d{2}"'
Cela correspond aux chaînes contenant une valeur de type date, telle que 2026-07-01.
Sans chaîne brute, les littéraux de chaîne ordinaires traitent les séquences d’échappement avant l’évaluation du motif d’expression régulière ; ainsi, des motifs tels que \d, \s ou des caractères littéraux échappés peuvent nécessiter des barres obliques inversées supplémentaires.
Motifs d’expressions régulières courants
Les exemples suivants utilisent la syntaxe RE2 courante dans les expressions de filtrage Milvus. Pour la syntaxe complète des expressions régulières, reportez-vous à la référence de syntaxe RE2.
| Condition | Motif | Exemple de filtre |
|---|---|---|
| Contient du texte littéral | error | filter = 'message =~ "error"' |
| Commence par un préfixe | ^ERR | filter = 'code =~ "^ERR"' |
| Se termine par un suffixe | \.json$ | filter = 'filename =~ "\\.json$"' |
| Correspond à une séquence de chiffres | [0-9]+ | filter = 'message =~ "[0-9]+"' |
| Correspond à un nombre fixe de chiffres | [0-9]{4} | filter = 'code =~ "[0-9]{4}"' |
| Correspond à un domaine de messagerie | @example\.com$ | filter = 'email =~ "@example\\.com$"' |
| Correspond sans distinction de majuscules/minuscules | (?i)error | filter = 'message =~ "(?i)error"' |
| Correspond à la chaîne complète | ^prod-[0-9]+$ | filter = 'name =~ "^prod-[0-9]+$"' |
Pour rechercher l'un parmi plusieurs mots, utilisez l'alternance avec |:
filter = 'message =~ "error|failed|timeout"'
Lorsque vous souhaitez faire correspondre littéralement des méta-caractères d'expressions régulières, échappez-les dans le motif d'expression régulière. Par exemple, pour faire correspondre un point littéral (\. dans une expression régulière), écrivez \\. dans une chaîne de filtre Python :
filter = 'email =~ "@gmail\\.com$"'
Remarque : les filtres d’expressions régulières de Milvus suivent la syntaxe RE2. Si un motif d’expression régulière utilise une syntaxe non prise en charge par RE2 ou est invalide pour toute autre raison, Milvus rejette l’expression de filtre. Pour plus de détails sur les métacaractères, les indicateurs et le comportement de correspondance des expressions régulières, consultez la référence syntaxique RE2.
Comportement de correspondance
Correspondance de sous-chaînes
La correspondance d’expressions régulières de Milvus utilise la sémantique des sous-chaînes. Le motif n’a pas besoin de correspondre à la valeur entière du champ. Par exemple, le filtre suivant correspond à la fois à E1001 et à failed with E1001 after retry:
filter = 'message =~ "E[0-9]{4}"'
Pour faire correspondre la valeur complète du champ, utilisez les ancrages ^ et $:
# Match only values that are exactly E followed by four digits
filter = 'code =~ "^E[0-9]{4}$"'
Champs VARCHAR pouvant contenir des valeurs nulles
Les filtres Regex ne correspondent pas aux valeurs nulles. Cela s'applique aussi bien à « =~ » qu'à « !~ ». Si vous souhaitez exclure un motif Regex tout en conservant les valeurs nulles, ajoutez explicitement « OR field IS NULL » :
filter = 'message !~ "^DEBUG" OR message IS NULL'
Chemins JSON
Pour les chemins JSON, les filtres d’expressions régulières se comportent différemment lorsque le chemin est manquant, nul ou qu’il renvoie une valeur non textuelle :
| Filtre | Inclut-il les valeurs manquantes/null/non-chaîne ? | Remarques |
|---|---|---|
json_field["path"] =~ "pattern" | Non | Ne correspond qu’aux valeurs de type chaîne de caractères qui satisfont au motif d’expression régulière. |
json_field["path"] !~ "pattern" | Oui | Renvoie les entités dont le chemin est manquant, nul, non-chaîne ou une chaîne qui ne correspond pas au motif d'expression régulière. |
Accélérer la correspondance de motifs grâce aux index
Milvus prend en charge plusieurs types d’index sur les champs de type chaîne de caractères, qui peuvent être utilisés conjointement avec des filtres « LIKE » et des filtres d’expressions régulières sur les champs « VARCHAR » ou les chemins d’accès sous forme de chaînes JSON, tels que NGRAM, STL_SORT, INVERTED et BITMAP. La correspondance de motifs peut fonctionner sans index, mais un index peut améliorer les performances sur des ensembles de données volumineux.
L'efficacité de l'index dépend de l'expression du motif, de la capacité de Milvus à extraire des sous-chaînes littérales fixes, ainsi que de la cardinalité et de la distribution du champ cible. Les motifs de type préfixe, tels que name LIKE "Prod%", peuvent bénéficier de stratégies d'indexation différentes de celles utilisées pour les motifs de type infixe ou suffixe, tels que description LIKE "%vector%" ou filename LIKE "%.json".
Utilisez le tableau suivant comme point de départ, puis effectuez des tests de performance avec votre propre charge de travail :
| Modèle ou caractéristique des données | Index à envisager | Remarques |
|---|---|---|
Contient des sous-chaînes littérales fixes, telles que message =~ "error.*timeout" ou message LIKE "%database%" | NGRAM | Utile lorsque Milvus peut extraire des sous-chaînes littérales significatives du modèle. Pour plus de détails, reportez-vous à NGRAM. |
| Filtres de chaînes de caractères de type préfixe, exacts ou d’égalité, en particulier sur les champs présentant une cardinalité faible à modérée | STL_SORT, INVERTED ou BITMAP | Peuvent s’avérer plus efficaces lorsque le champ comporte des valeurs répétées ou lorsque le filtre s’apparente à une correspondance exacte. Pour plus de détails, voir STL_SORT, INVERTED et BITMAP. |
| Motifs Regex sans littéraux fixes, ou motifs dominés par des classes de caractères, des tokens courts ou des caractères génériques | Effectuez des tests de performance avant de vous fier à l’accélération par index | Ces motifs peuvent offrir une sélectivité d’index limitée et peuvent se rabattre sur des balayages plus larges. |