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 fonctionnement de l'analyseur de texte avec la recherche dans BigQuery. Pour en savoir plus sur la syntaxe de l'analyseur 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'expression régulière 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 correspondant au modèle (à gauche) de 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}(?:[az]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 de texte SEARCH(text, query) Explication
abc abcdef abcghi
  • abcghi
VRAI "abc" dans ['abcghi']
cd[a-z] abcdef abcghi
  • abcghi
FAUX "cde" dans ['abcghi']
[a-z]/ a/b/ a/b/c/d/
  • a/
  • b/
  • c/
  • d/
VRAI 'a/' dans ['a/', 'b/', 'c/', 'd/'] ET 'b/' dans ['a/', 'b/', 'c/', 'd/']
/[^/]+/ aa/bb/ aa/bb/cc/
  • /bb/
VRAI '/bb/' dans ['/bb/']
/[^/]+/ bb aa/bb/cc/
  • /bb/
ERREUR Aucune correspondance trouvée dans le terme de requête
[0-9]+ abc abc123 ERREUR Aucune correspondance trouvée dans le terme de 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.
[az][a-z0-9]*@google\.com Voici mon adresse e-mail : [email protected] [email protected] VRAI "[email protected]" dans "[email protected]"
abc abc\ abc abc
  • abc
VRAI "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
FAUX "aBc" dans ["Abc"]
(?i)(?:Abc)

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

Examples

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 par la normalisation et les mots d'arrêt ICU de NFKC.

L'exemple suivant configure les options LOG_ANALYZER avec la normalisation et les mots d'arrêt NFKC ICU. 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 LOG_ANALYZER, consultez la section 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 caractère Unicode du point d'interrogation double a été normalisé en deux caractères ASCII.

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'analyse spécifiées dans l'index de recherche. Notez que si les configurations d'analyse de la fonction SEARCH ne correspondent pas à celles de l'index de recherche, cet index 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 modèle 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 PATTERN_ANALYZER, consultez la section PATTERN_ANALYZER. Dans cet exemple, nos 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 incluant 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 formats 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 rechercher 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" VRAI 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`" VRAI 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