Mit Textanalysatoren arbeiten

Die CREATE SEARCH INDEX-DDL-Anweisung, SEARCH-Funktion und TEXT_ANALYZE-Funktion unterstützen erweiterte Konfigurationsoptionen für Textanalysatoren. Mit den Textanalysatoren von BigQuery und den zugehörigen Optionen können Sie die Suche verfeinern.

Dieses Dokument bietet einen Überblick über die verschiedenen in BigQuery verfügbaren Textanalysatoren und ihre Konfigurationsoptionen sowie Beispiele für die Funktionsweise von Textanalysatoren mit der Suche in BigQuery. Weitere Informationen zur Syntax des Textanalysators finden Sie unter Textanalyse.

Textanalysatoren

BigQuery unterstützt die folgenden Textanalysatoren:

  • NO_OP_ANALYZER
  • LOG_ANALYZER
  • PATTERN_ANALYZER

NO_OP_ANALYZER

Verwenden Sie NO_OP_ANALYZER, wenn vorverarbeitete Daten, die Sie genau abgleichen möchten, bereits vorhanden sind. Auf den Text wird keine Tokenisierung oder Normalisierung angewendet. Da dieses Analysetool keine Tokenisierung oder Normalisierung durchführt, wird keine Konfiguration akzeptiert. Weitere Informationen zu NO_OP_ANALYZER finden Sie unter NO_OP_ANALYZER.

LOG_ANALYZER

Mit LOG_ANALYZER werden Daten so geändert:

  • Text wird in Kleinbuchstaben umgewandelt.
  • ASCII-Werte, die größer als 127 sind, werden unverändert beibehalten.

  • Text wird anhand der folgenden Trennzeichen in einzelne Begriffe unterteilt, die als Tokens bezeichnet werden:

    [ ] < > ( ) { } | ! ; , ' " * & ? + / : = @ . - $ % \ _ \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
    

    Wenn Sie die Standardtrennzeichen nicht verwenden möchten, können Sie die Trennzeichen angeben, die Sie als Textanalysatoroptionen verwenden möchten. Mit LOG_ANALYZER können Sie bestimmte Trennzeichen und Tokenfilter konfigurieren, um die Suchergebnisse besser steuern zu können. Weitere Informationen zu den spezifischen Konfigurationsoptionen bei Verwendung von LOG_ANALYZER, siehe delimiters-Analyseoption und token_filters-Analyseoption.

PATTERN_ANALYZER

Der Textanalysator PATTERN_ANALYZER extrahiert Tokens aus einem Text mithilfe eines regulären Ausdrucks. Die reguläre Ausdrucks-Engine und die mit PATTERN_ANALYZER verwendete Syntax sind RE2. PATTERN_ANALYZER tokenisiert Muster in der folgenden Reihenfolge:

  1. Es wird der erste Teilstring gefunden, der mit dem Muster (von links) im String übereinstimmt. Dies ist ein Token, das in der Ausgabe enthalten sein soll.
  2. Es entfernt alles aus dem Eingabestring bis zum Ende des Teilstrings, der in Schritt 1 ermittelt wurde.
  3. Der Vorgang wird wiederholt, bis der String leer ist.

Die folgende Tabelle enthält Beispiele für die Extraktion von Tokens mit PATTERN_ANALYZER:

Muster Eingabetext Ausgabetokens
ab ababab
  • ab
ab abacad
  • ab
[a-z]{2} abacad
  • ab
  • ac
  • Anzeige
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
".+" „cats“ und „dogs“
  • „cats“ und „dogs“


Hinweis: Die Verwendung von gierigen Quantifizierern + führt dazu, dass die Übereinstimmung mit dem längsten String im Text abgeglichen wird, wodurch „cats“ und „dogs“ als Token im Text extrahiert werden.
".+?" „cats“ und „dogs“
  • „cats“
  • „dogs“


hinweis: Die Verwendung von verzögerten Quantifizierern + führt dazu, dass der reguläre Ausdruck mit dem kürzesten String im Text übereinstimmt, was „cats“, „dogs“ als zwei separate Tokens im Text extrahiert.

Mit dem Textanalysator PATTERN_ANALYZER haben Sie mehr Kontrolle über die Tokens, die aus einem Text extrahiert werden, wenn er mit der Funktion SEARCH verwendet wird. Die folgende Tabelle zeigt, wie verschiedene Muster und Ergebnisse zu unterschiedlichen SEARCH-Ergebnissen führen:

Muster Abfrage Text Tokens aus Text SEARCH(text, query) Erklärung
abc abcdef abcghi
  • abcghi
TRUE 'abc' in ['abcghi']
cd[a-z] abcdef abcghi
  • abcghi
FALSE 'cde' in ['abcghi']
[a-z]/ a/b/ a/b/c/d/
  • a/
  • b/
  • c/
  • d/
TRUE 'a/' in ['a/', 'b/', 'c/', 'd/'] AND 'b/' in ['a/', 'b/', 'c/', 'd/']
/[^/]+/ aa/bb/ aa/bb/cc/
  • /bb/
TRUE '/bb/' in ['/bb/']
/[^/]+/ bb aa/bb/cc/
  • /bb/
FEHLER Keine Übereinstimmung im Suchbegriff gefunden
[0-9]+ abc abc123 FEHLER Keine Übereinstimmung im Suchbegriff gefunden
[0-9]+ `abc` abc123 FEHLER Keine Übereinstimmung im Suchbegriff gefunden

Übereinstimmender Backtick als Graviszeichen, kein Sonderzeichen.
[a-z][a-z0-9]*@google\.com Dies ist meine E-Mail-Adresse: test@google.com test@google.com
  • test@google.com
TRUE 'test@google.com' in 'test@google.com'
abc abc\ abc abc
  • abc
TRUE 'abc' in ['abc']

Beachten Sie, dass "abc abc" eine einzelne Unterabfrage ist, nachdem der Parser der Suchanfrage geparst wurde, da der Bereich maskiert ist.
(?i)(?:Abc) (keine Normalisierung) aBcd Abc
  • Abc
FALSE 'aBc' in ['Abc']
(?i)(?:Abc)

Normalisierung:
lower_case = true
aBcd Abc
  • abc
TRUE 'abc' in ['abc']
(?:/?)abc bc/abc /abc/abc/
  • /abc
TRUE '/abc' in ['/abc']
(?:/?)abc abc d/abc
  • /abc
FALSE 'abc' in ['/abc']
".+" „cats“ „cats“ und „dogs“
  • „cats“ und „dogs“
FALSE '"cats"' in ['"cats" and "dogs"]

Hinweis: Die Verwendung von gierigen Quantifizierern + führt dazu, dass die Übereinstimmung mit dem längsten String im Text abgeglichen wird, wodurch „cats“ und „dogs“ als Token im Text extrahiert werden.
".+?" „cats“ „cats“ und „dogs“
  • „cats“
  • „dogs“
TRUE "cats" in ["cats", "dogs"]

Hinweis: Die Verwendung von verzögerten Quantifizierern + führt dazu, dass der reguläre Ausdruck mit dem kürzesten String im Text übereinstimmt, was „cats“, „dogs“ als zwei separate Tokens im Text extrahiert.

Beispiele

Die folgenden Beispiele zeigen die Verwendung der Textanalyse mit Anpassungsoptionen zum Erstellen von Suchindexen, zum Extrahieren von Tokens und zum Zurückgeben von Suchergebnissen.

LOG_ANALYZER mit NFKC-ICU-Normalisierung und Stoppwörtern.

Im folgenden Beispiel werden LOG_ANALYZER-Optionen mit NFKC ICU-Normalisierung und Stoppwörter konfiguriert. In diesem Beispiel wird davon ausgegangen, dass die folgende Datentabelle bereits Daten enthält:

CREATE TABLE dataset.data_table(
  text_data STRING
);

Erstellen Sie einen JSON-formatierten String in der Option analyzer_options der DDL-Anweisung CREATE SEARCH INDEX, um einen Suchindex mit der NFKC ICU-Normalisierung und einer Liste von Stoppwörtern zu erstellen. eine Eine vollständige Liste der Optionen, die beim Erstellen eines Suchindex mit LOG_ANALYZER verfügbar sind, finden Sie unter LOG_ANALYZER. In diesem Beispiel lauten unsere Stoppwörter "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"] }
    ]
  }''');

Im obigen Beispiel wird in der folgenden Tabelle die Tokenextraktion für verschiedene Werte von text_data beschrieben. Beachten Sie, dass in diesem Dokument das doppelte Fragezeichen (??) kursiv dargestellt wird, um zwischen zwei Fragezeichen (??) zu unterscheiden:

Datentext Tokens für den Index Erklärung
The Quick Brown Fox ["quick", "brown", "fox"] Die Tokenisierung von LOG_ANALYZER erzeugt die Tokens ["The", "Quick", "Brown", "Fox"].

Als Nächstes wird die ICU-Normalisierung mit icu_case_folding = true Kleinbuchstaben erstellt, um ["the", "fast", "brown", "fox"] zu erzeugen.

Der Filter für Stoppwörter entfernt "der" aus der Liste.
The Ⓠuick Ⓑrown Ⓕox ["quick", "brown", "fox"] Die Tokenisierung von LOG_ANALYZER erzeugt die Tokens ["The", "Quick", "Brown", "Fox"].

Als Nächstes werden die Token durch NFKC ICU-Normalisierung mit icu_case_folding = true kleingeschrieben, um ["the", "quick", "brown", "fox"] zu erzeugen

Schließlich entfernt der Stoppwortfilter "the" aus der Liste.
ⓆuickⒻox ["quick??fox"] Die Tokenisierung von LOG_ANALYZER erzeugt die Tokens ["The", "ⓆuickⒻox"].

Als Nächstes werden die Token durch NFKC ICU-Normalisierung mit icu_case_folding = true kleingeschrieben, um ["quick??fox"] zu erzeugen. Beachten Sie, dass der doppelte Fragezeichen-Unicode als zwei Fragezeichen-ASCII-Zeichen normalisiert wurde.

Der Filter „Stoppwörter“ tut nichts, da keines der Tokens in der Filterliste enthalten ist.

Nachdem der Suchindex erstellt wurde, können Sie mit der Funktion SEARCH in der Tabelle mit denselben im Suchindex angegebenen Analysekonfigurationen suchen. Beachten Sie, dass der Suchindex nicht verwendet wird, wenn die Analysekonfigurationen in der Funktion SEARCH nicht mit denen des Suchindex übereinstimmen. Verwenden Sie die folgende Abfrage:

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"]
      }
    ]
  }''')

Ersetzen Sie Folgendes:

  • search_query: Der Text, nach dem Sie suchen möchten.

Die folgende Tabelle zeigt verschiedene Ergebnisse basierend auf unterschiedlichem Suchtext und unterschiedlichen Werten von search_query:

text_data search_query Ergebnis Erklärung
The Quick Brown Fox "Ⓠuick" TRUE Die letzte Liste der aus dem Text extrahierten Tokens ist ["quick", "brown", "fox"].
Die letzte Liste der aus der Textabfrage extrahierten Tokens lautet [„quick“].

Die Listen-Abfragetokens finden Sie alle in den Texttokens.
The Ⓠuick Ⓑrown Ⓕox "quick" TRUE Die letzte Liste der aus dem Text extrahierten Tokens ist ["quick", "brown", "fox"].
Die letzte Liste der aus der Textabfrage extrahierten Tokens lautet [„quick“].

Die Listen-Abfragetokens finden Sie alle in den Texttokens.
ⓆuickⒻox "quick" FALSE Die letzte Liste der aus dem Text extrahierten Tokens lautet ["quick??fox"].

Die letzte Liste der aus der Textabfrage extrahierten Tokens lautet [„quick“].

„Quick“ ist nicht in der Liste der Tokens aus dem Text enthalten.
ⓆuickⒻox "quickfox" TRUE Die letzte Liste der aus dem Text extrahierten Tokens lautet ["quick??fox"].

Die letzte Liste der aus der Textabfrage extrahierten Tokens lautet ["quick??fox"].

„fast??fox“ ist in der Liste der Tokens aus dem Text enthalten.
ⓆuickⒻox "`quickfox`" FALSE In LOG_ANALYZER erfordert der Backtick eine genaue Textübereinstimmung.

PATTERN_ANALYZER für IPv4-Suche mit Stoppwörtern

Im folgenden Beispiel wird der Textanalysator PATTERN_ANALYZER so konfiguriert, dass er nach einem bestimmten Muster sucht, während bestimmte Stoppwörter gefiltert werden. In diesem Beispiel stimmt das Muster mit einer IPv4-Adresse überein und ignoriert den localhost-Wert (127.0.0.1).

In diesem Beispiel wird davon ausgegangen, dass die folgende Tabelle Daten enthält:

CREATE TABLE dataset.data_table(
  text_data STRING
);

Wenn Sie einen Suchindex pattern und eine Liste von Stoppwörtern erstellen möchten, erstellen Sie einen JSON-formatierten String in der Option analyzer_options der CREATE SEARCH INDEX DDL-Anweisung Eine vollständige Liste der Optionen, die beim Erstellen eines Suchindex mit PATTERN_ANALYZER verfügbar sind, finden Sie unter PATTERN_ANALYZER. In diesem Beispiel sind die Stoppwörter die localhost-Adresse 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"
      ]
    }
  ]
}'''
);

Wenn Sie reguläre Ausdrücke mit analyzer_options verwenden, fügen Sie drei führende \-Symbole ein, um reguläre Ausdrücke mit einem \-Symbol wie \d oder \b ordnungsgemäß zu maskieren.

In der folgenden Tabelle werden die Tokenisierungsoptionen für verschiedene Werte von text_data beschrieben:

Datentext Tokens für den Index Erklärung
abc192.168.1.1def 172.217.20.142 ["192.168.1.1", "172.217.20.142"] Die IPv4-Muster erfassen die IPv4-Adressen, auch wenn zwischen der Adresse und dem Text kein Leerzeichen vorhanden ist.
104.24.12.10abc 127.0.0.1 ["104.24.12.10"] „127.0.0.1“ wird herausgefiltert, da er in der Liste der Stoppwörter enthalten ist.

Nachdem der Suchindex erstellt wurde, können Sie mit der Funktion SEARCH in der Tabelle basierend auf der in analyzer_options angegebenen Tokenisierung suchen. Verwenden Sie die folgende Abfrage:

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"
        ]
      }
    ]
  }'''
);

Ersetzen Sie Folgendes:

  • search_query: Der Text, nach dem Sie suchen möchten.

Die folgende Tabelle zeigt verschiedene Ergebnisse basierend auf unterschiedlichem Suchtext und unterschiedlichen Werten von search_query:

text_data search_query Ergebnis Erklärung
128.0.0.2 "127.0.0.1" FEHLER Kein Suchtoken in der Abfrage.

Die Abfrage durchläuft den Textanalysator, der das Token „127.0.0.1“ herausfiltert.
abc192.168.1.1def 172.217.20.142 "192.168.1.1abc" TRUE Die Liste der aus der Abfrage extrahierten Tokens lautet ["192.168.1.1"].

Die Liste der aus Text extrahierten Tokens lautet ["192.168.1.1", "172.217.20.142"].
abc192.168.1.1def 172.217.20.142 "`192.168.1.1`" TRUE Die Liste der aus der Abfrage extrahierten Tokens lautet ["192.168.1.1"].

Die Liste der aus Text extrahierten Tokens lautet ["192.168.1.1", "172.217.20.142"].

Die Backticks werden für PATTERN_ANALYZER als reguläre Zeichen behandelt.

Nächste Schritte