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 vonLOG_ANALYZER
, siehedelimiters
-Analyseoption undtoken_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:
- 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.
- Es entfernt alles aus dem Eingabestring bis zum Ende des Teilstrings, der in Schritt 1 ermittelt wurde.
- 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 | 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 |
|
".+" | „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“ |
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 |
|
TRUE | 'abc' in ['abcghi'] |
cd[a-z] | abcdef | abcghi |
|
FALSE | 'cde' in ['abcghi'] |
[a-z]/ | a/b/ | a/b/c/d/ |
|
TRUE | 'a/' in ['a/', 'b/', 'c/', 'd/'] AND 'b/' in ['a/', 'b/', 'c/', 'd/'] |
/[^/]+/ | aa/bb/ | aa/bb/cc/ |
|
TRUE | '/bb/' in ['/bb/'] |
/[^/]+/ | bb | aa/bb/cc/ |
|
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 |
|
TRUE | 'test@google.com' in 'test@google.com' |
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 |
|
FALSE | 'aBc' in ['Abc'] |
(?i)(?:Abc) Normalisierung: lower_case = true |
aBcd | Abc |
|
TRUE | 'abc' in ['abc'] |
(?:/?)abc | bc/abc | /abc/abc/ |
|
TRUE | '/abc' in ['/abc'] |
(?:/?)abc | abc | d/abc |
|
FALSE | 'abc' in ['/abc'] |
".+" | „cats“ | „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“ |
|
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 erzeugenSchließ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 |
Folge | 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 | "quick⁇fox" |
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 | "`quick⁇fox`" |
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 |
Folge | 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
- Eine Übersicht über Anwendungsfälle für den Suchindex, die Preise, die erforderlichen Berechtigungen und Einschränkungen finden Sie unter Einführung in die Suche in BigQuery.
- Informationen zur effizienten Suche in indexierten Spalten finden Sie unter Mit einem Index suchen.