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 du LOG_ANALYZER, consultez les pages option d'analyseur delimiters et option d'analyseur token_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 RE2. PATTERN_ANALYZER tokenise les modèles dans l'ordre suivant :

  1. 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.
  2. Il supprime tout de la chaîne d'entrée jusqu'à la fin de la sous-chaîne trouvée à l'étape 1.
  3. 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
ab abacad
  • ab
[a-z]{2} abacad
  • ab
  • ac
  • annonce
aaa aaaaa
  • aaa
[a-z]/ a/b/c/d/e
  • a/
  • b/
  • c/
  • d/
/[^/]+/ aa/bb/cc
  • /bb/
[0-9]+ abc
(?:/?)[a-z] /abc
  • /abc
(?:/)[a-z] /abc
  • /abc
(?:[0-9]abc){3}(?:[a-z]000){2} 7abc7abc7abcx000y000
  • 7abc7abc7abcx000y000
".+" "chats" et "chiens"
  • "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"
  • "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.

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
  • abcghi
TRUE "abc" dans ['abcghi']
cd[a-z] abcdef abcghi
  • abcghi
FALSE 'cde' dans ['abcghi']
[a-z]/ a/b/ a/b/c/d/
  • a/
  • b/
  • c/
  • d/
TRUE 'a/' dans ['a/', 'b/', 'c/', 'd/'] ET 'b/' dans ['a/', 'b/', 'c/', 'd/']
/[^/]+/ aa/bb/ aa/bb/cc/
  • /bb/
TRUE '/bb/' dans ['/bb/']
/[^/]+/ bb aa/bb/cc/
  • /bb/
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
  • test@google.com
TRUE 'test@google.com' dans 'test@google.com'
abc 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
  • Abc
FALSE 'aBc' dans ['Abc']
(?i)(?:Abc)

normalisation :
lower_case = true
aBcd Abc
  • abc
TRUE "abc" dans ['abc']
(?:/?)abc bc/abc /abc/abc/
  • /abc
TRUE '/abc' dans ['/abc']
(?:/?)abc abc d/abc
  • /abc
FALSE "abc" dans ['/abc']
".+" "chats" "chats" et "chiens"
  • "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"
  • "chats"
  • "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 "quickfox" 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 "`quickfox`" 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