Utiliser des analyseurs de texte
L'instruction LDD CREATE SEARCH INDEX
, la fonction SEARCH
et la fonction TEXT_ANALYZE
prennent en charge les options de configuration avancées de l'analyseur de texte. Comprendre les analyseurs de texte de BigQuery et leurs options vous permet d'affiner votre expérience de recherche.
Ce document présente les différents analyseurs de texte disponibles dans BigQuery et leurs options de configuration, ainsi que des exemples de leur fonctionnement avec la recherche dans BigQuery. Pour en savoir plus sur la syntaxe des analyseurs de texte, consultez la page Analyse de texte.
Analyseurs de texte
BigQuery est compatible avec les analyseurs de texte suivants :
NO_OP_ANALYZER
LOG_ANALYZER
PATTERN_ANALYZER
NO_OP_ANALYZER
Utilisez NO_OP_ANALYZER
lorsque vous souhaitez faire correspondre exactement des données prétraitées. Aucune tokenisation ni normalisation n'est appliquée au texte. Étant donné que cet analyseur n'effectue ni tokenisation, ni normalisation, il n'accepte aucune configuration. Pour en savoir plus sur NO_OP_ANALYZER
, consultez la page NO_OP_ANALYZER
.
LOG_ANALYZER
Le fichier LOG_ANALYZER
modifie les données de différentes manières :
- Le texte est écrit en minuscules.
Les valeurs ASCII supérieures à 127 sont conservées telles quelles.
Le texte est divisé en termes individuels appelés jetons par les délimiteurs suivants :
[ ] < > ( ) { } | ! ; , ' " * & ? + / : = @ . - $ % \ _ \n \r \s \t %21 %26 %2526 %3B %3b %7C %7c %20 %2B %2b %3D %3d %2520 %5D %5d %5B %5b %3A %3a %0A %0a %2C %2c %28 %29
Si vous ne souhaitez pas utiliser les délimiteurs par défaut, vous pouvez spécifier les délimiteurs que vous souhaitez utiliser comme options d'analyse de texte.
LOG_ANALYZER
vous permet de configurer des délimiteurs et des filtres de jetons spécifiques pour mieux contrôler les résultats de recherche. Pour en savoir plus sur les options de configuration spécifiques disponibles lors de l'utilisation duLOG_ANALYZER
, consultez les pages option d'analyseurdelimiters
et option d'analyseurtoken_filters
.
PATTERN_ANALYZER
L'analyseur de texte PATTERN_ANALYZER
extrait les jetons d'un texte à l'aide d'une expression régulière. Le moteur d'expressions régulières et la syntaxe utilisés avec PATTERN_ANALYZER
sont implémentés par RE2. PATTERN_ANALYZER
tokenise les modèles dans l'ordre suivant :
- Il trouve la première sous-chaîne qui correspond au modèle (depuis la gauche) dans la chaîne. Il s'agit d'un jeton à inclure dans la sortie.
- Il supprime tout de la chaîne d'entrée jusqu'à la fin de la sous-chaîne trouvée à l'étape 1.
- Il répète le processus jusqu'à ce que la chaîne soit vide.
Le tableau suivant fournit des exemples d'extraction de jetons PATTERN_ANALYZER
:
Modèle | Texte d'entrée | Jetons de sortie |
---|---|---|
ab | ababab |
|
ab | abacad |
|
[a-z]{2} | abacad |
|
aaa | aaaaa |
|
[a-z]/ | a/b/c/d/e |
|
/[^/]+/ | aa/bb/cc |
|
[0-9]+ | abc | |
(?:/?)[a-z] | /abc |
|
(?:/)[a-z] | /abc |
|
(?:[0-9]abc){3}(?:[a-z]000){2} | 7abc7abc7abcx000y000 |
|
".+" | "chats" et "chiens" |
Notez que l'utilisation de quantificateurs gourmands + permet de faire correspondre la chaîne la plus longue possible dans le texte. Ainsi '"chats" et "chiens'" sont extraits en tant que jetons dans le texte. |
".+?" | "chats" et "chiens" |
Notez que l'utilisation de quantificateurs différés +? permet à l'expression régulière de correspondre à la chaîne la plus courte possible dans le texte. Ainsi "'chats'"., '"chiens"' sont extraits comme étant deux jetons distincts dans le texte. |
L'analyseur de texte PATTERN_ANALYZER
vous permet de mieux contrôler les jetons extraits d'un texte lorsqu'il est utilisé avec la fonction SEARCH
. Le tableau suivant montre comment différents modèles et résultats génèrent des résultats SEARCH
différents :
Modèle | Requête | Texte | Jetons à partir du texte | SEARCH(text, query) | Explication |
---|---|---|---|---|---|
abc | abcdef | abcghi |
|
TRUE | 'abc' dans ['abcghi'] |
cd[a-z] | abcdef | abcghi |
|
FALSE | 'cde' dans ['abcghi'] |
[a-z]/ | a/b/ | a/b/c/d/ |
|
TRUE | 'a/' dans ['a/', 'b/', 'c/', 'd/'] ET 'b/' dans ['a/', 'b/', 'c/', 'd/'] |
/[^/]+/ | aa/bb/ | aa/bb/cc/ |
|
TRUE | '/bb/' dans ['/bb/'] |
/[^/]+/ | bb | aa/bb/cc/ |
|
ERREUR | Aucune correspondance n'a été trouvée dans le terme de la requête |
[0-9]+ | abc | abc123 | ERREUR | Aucune correspondance n'a été trouvée dans le terme de la requête | |
[0-9]+ | `abc` | abc123 | ERREUR | Aucune correspondance n'a été trouvée dans le terme de la requête Les accents graves sont des accents graves, et non des caractères spéciaux. |
|
[a-z][a-z0-9]*@google\.com | Voici mon adresse e-mail : test@google.com | test@google.com |
|
TRUE | 'test@google.com' dans 'test@google.com' |
abc | abc\ abc | abc |
|
TRUE | 'abc' dans ['abc'] Notez que "abc abc" est une sous-requête unique après avoir été analysée par l'analyseur de requêtes de recherche car l'espace est échappé. |
(?i)(?:Abc) (pas de normalisation) | aBcd | Abc |
|
FALSE | 'aBc' dans ['Abc'] |
(?i)(?:Abc) normalisation : lower_case = true |
aBcd | Abc |
|
TRUE | 'abc' dans ['abc'] |
(?:/?)abc | bc/abc | /abc/abc/ |
|
TRUE | '/abc' dans ['/abc'] |
(?:/?)abc | abc | d/abc |
|
FALSE | 'abc' dans ['/abc'] |
".+" | "chats" | "chats" et "chiens" |
|
FALSE | '"chats"' dans ['"chats" et "chiens'"] Notez que l'utilisation de quantificateurs gourmands + permet à l'expression régulière de correspondre à la valeur Chaîne la plus longue possible dans le texte. Ainsi '"chats" et "chiens'" sont extraits comme étant un seul jeton dans le texte. |
".+?" | "chats" | "chats" et "chiens" |
|
TRUE | '"chats"' dans ['"chats"', '"chiens"] Notez que l'utilisation de quantificateurs différés +? permet à l'expression régulière de correspondre à la chaîne la plus courte possible dans le texte. Ainsi '"chats'", "'chiens"' sont extraits comme étant deux jetons distincts dans le texte. |
Exemples
Les exemples suivants illustrent l'utilisation de l'analyse de texte avec des options de personnalisation pour créer des index de recherche, extraire des jetons et renvoyer des résultats de recherche.
LOG_ANALYZER
avec normalisation NFKC ICU et mots d'arrêt
L'exemple suivant configure les options LOG_ANALYZER
avec la normalisation NFKC ICU et les mots d'arrêt. L'exemple suppose que la table de données suivante contient des données déjà renseignées :
CREATE TABLE dataset.data_table( text_data STRING );
Pour créer un index de recherche avec la normalisation NFKC ICU et une liste de mots d'arrêt, créez une chaîne au format JSON dans l'option analyzer_options
de l'instruction LDD CREATE
SEARCH INDEX
.
Pour obtenir la liste complète des options disponibles lors de la création d'un index de recherche avec le LOG_ANALYZER
, reportez-vous à LOG_ANALYZER
.
Dans cet exemple, les mots d'arrêt sont "the", "of", "and", "for"
.
CREATE OR REPLACE SEARCH INDEX `my_index` ON `dataset.data_table`(ALL COLUMNS) OPTIONS( analyzer='PATTERN_ANALYZER', analyzer_options= '''{ "token_filters": [ { "normalizer": { "mode": "ICU_NORMALIZE", "icu_normalize_mode": "NFKC", "icu_case_folding": true } }, { "stop_words": ["the", "of", "and", "for"] } ] }''');
Selon l'exemple précédent, le tableau suivant décrit l'extraction de jetons pour différentes valeurs de text_data
. Dans ce document, le point d'interrogation double (??) a été mis en italique pour le différencier de deux points d'interrogation (??) :
Texte des données | Jetons pour l'index | Explication |
---|---|---|
The Quick Brown Fox | ["quick", "brown", "fox"] | La tokenisation LOG_ANALYZER produit des jetons ["The", "Quick", "Brown", "Fox"]. Ensuite, la normalisation ICU avec icu_case_folding = true passe les jetons en minuscules pour obtenir ["the", "quick", "brown", "fox"]Enfin, le filtre "Mots d'arrêt" supprime le mot "the" de la liste. |
The Ⓠuick Ⓑrown Ⓕox | ["quick", "brown", "fox"] | La tokenisation LOG_ANALYZER produit des jetons ["The", "Ⓠuick", "Ⓑrown", "Ⓕox"]. Ensuite, la normalisation NFKC ICU avec icu_case_folding = true passe les jetons en minuscules pour obtenir ["the", "quick", "brown", "fox"]Enfin, le filtre "Mots d'arrêt" supprime le mot "the" de la liste. |
Ⓠuick⁇Ⓕox | ["quick??fox"] | La tokenisation LOG_ANALYZER produit des jetons ["The", "Ⓠuick⁇Ⓕox"]. Ensuite, la normalisation NFKC ICU avec icu_case_folding = true passe les jetons en minuscules pour obtenir ["quick??fox"]. Notez que le point d'interrogation Unicode double a été normalisé en deux caractères ASCII de point d'interrogation.Enfin, le filtre de mots d'arrêt n'a aucun effet, car aucun des jetons ne figure dans la liste de filtres. |
Maintenant que l'index de recherche a été créé, vous pouvez utiliser la fonction SEARCH
pour effectuer une recherche dans la table à l'aide des mêmes configurations d'analyseur spécifiées dans l'index de recherche. Notez que si les configurations d'analyseur dans la fonction SEARCH
ne correspondent pas à celles de l'index de recherche, l'index de recherche ne sera pas utilisé. Utilisez la requête suivante :
SELECT SEARCH( analyzer => 'LOG_ANALYZER', analyzer_options => '''{ "token_filters": [ { "normalizer": { "mode": "ICU_NORMALIZE", "icu_normalize_mode": "NFKC", "icu_case_folding": true } }, { "stop_words": ["the", "of", "and", "for"] } ] }''')
Remplacez les éléments suivants :
search_query
: texte que vous souhaitez rechercher.
Le tableau suivant montre divers résultats en fonction de différents textes de recherche et de différentes valeurs de search_query
:
text_data | search_query |
Résultat | Explication |
---|---|---|---|
The Quick Brown Fox | "Ⓠuick" |
TRUE |
La liste finale des jetons extraits du texte est ["quick", "brown", "fox"]. La liste finale des jetons extraits de la requête de texte correspond à ["quick"]. Les jetons de requête de liste se trouvent tous dans les jetons de texte. |
The Ⓠuick Ⓑrown Ⓕox | "quick" |
TRUE |
La liste finale des jetons extraits du texte est ["quick", "brown", "fox"]. La liste finale des jetons extraits de la requête de texte correspond à ["quick"]. Les jetons de requête de liste se trouvent tous dans les jetons de texte. |
Ⓠuick⁇Ⓕox | "quick" |
FALSE |
La liste finale des jetons extraits du texte est ["quick??fox"]. La liste finale des jetons extraits de la requête de texte correspond à ["quick"]. "quick" ne figure pas dans la liste des jetons du texte. |
Ⓠuick⁇Ⓕox | "quick⁇fox" |
TRUE |
La liste finale des jetons extraits du texte est ["quick??fox"]. La liste finale des jetons extraits de la requête de texte correspond à ["quick??fox"]. "quick??fox" figure dans la liste des jetons du texte. |
Ⓠuick⁇Ⓕox | "`quick⁇fox`" |
FALSE |
Dans LOG_ANALYZER , les accents graves nécessitent une correspondance de texte exacte. |
PATTERN_ANALYZER
pour la recherche IPv4 avec les mots d'arrêt
L'exemple suivant configure l'analyseur de texte PATTERN_ANALYZER
pour rechercher un format spécifique tout en filtrant certains mots d'arrêt. Dans cet exemple, le modèle correspond à une adresse IPv4 et ignore la valeur de l'hôte local (127.0.0.1
).
Cet exemple suppose que la table suivante contient des données :
CREATE TABLE dataset.data_table( text_data STRING );
Pour créer un index de recherche, l'option pattern
et une liste de mots d'arrêt, créez une chaîne au format JSON dans l'option analyzer_options
de l'instruction LDD CREATE SEARCH
INDEX
.
Pour obtenir la liste complète des options disponibles lors de la création d'un index de recherche avec le PATTERN_ANALYZER
, reportez-vous à PATTERN_ANALYZER
.
Dans cet exemple, les mots d'arrêt sont l'adresse de l'hôte local, 127.0.0.1
.
CREATE SEARCH INDEX my_index ON dataset.data_table(text_data) OPTIONS (analyzer = 'PATTERN_ANALYZER', analyzer_options = '''{ "patterns": [ "(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)[.]){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" ], "token_filters": [ { "stop_words": [ "127.0.0.1" ] } ] }''' );
Lorsque vous utilisez des expressions régulières avec analyzer_options
, incluez trois symboles \
de début pour échapper correctement les expressions régulières qui incluent un symbole \
, tel que \d
ou \b
.
Le tableau suivant décrit les options de tokenisation pour différentes valeurs de text_data
.
Texte des données | Jetons pour l'index | Explication |
---|---|---|
abc192.168.1.1def 172.217.20.142 | ["192.168.1.1", "172.217.20.142"] | Les modèles IPv4 capturent les adresses IPv4, même s'il n'y a pas d'espace entre l'adresse et le texte. |
104.24.12.10abc 127.0.0.1 | ["104.24.12.10"] | "127.0.0.1" est filtrée, car elle figure dans la liste des mots d'arrêt. |
Maintenant que l'index de recherche a été créé, vous pouvez utiliser la fonction SEARCH
pour effectuer une recherche dans la table en fonction de la tokenisation spécifiée dans analyzer_options
. Utilisez la requête suivante :
SELECT SEARCH(dataset.data_table.text_data "search_data", analyzer => 'PATTERN_ANALYZER', analyzer_options => '''{ "patterns": [ "(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)[.]){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" ], "token_filters": [ { "stop_words": [ "127.0.0.1" ] } ] }''' );
Remplacez les éléments suivants :
search_query
: texte que vous souhaitez rechercher.
Le tableau suivant montre divers résultats en fonction de différents textes de recherche et de différentes valeurs de search_query
:
text_data | search_query |
Résultat | Explication |
---|---|---|---|
128.0.0.2 | "127.0.0.1" | ERREUR | Aucun jeton de recherche dans la requête. La requête passe par l'analyseur de texte, qui filtre le jeton "127.0.0.1". |
abc192.168.1.1def 172.217.20.142 | "192.168.1.1abc" | TRUE | La liste des jetons extraits de la requête est ["192.168.1.1"]. La liste des jetons extraits du texte est ["192.168.1.1", "172.217.20.142"]. |
abc192.168.1.1def 172.217.20.142 | "`192.168.1.1`" | TRUE | La liste des jetons extraits de la requête est ["192.168.1.1"]. La liste des jetons extraits du texte est ["192.168.1.1", "172.217.20.142"]. Notez que les accents graves sont traités comme des caractères normaux pour PATTERN_ANALYZER. |
Étapes suivantes
- Pour obtenir une présentation des cas d'utilisation de l'index de recherche, des tarifs, des autorisations requises et des limites, consultez la page Présentation de la recherche dans BigQuery.
- Pour savoir comment effectuer des recherches efficaces des colonnes indexées, consultez la page Effectuer des recherches avec un index.