Auf dieser Seite wird beschrieben, wie Sie Tabellen Tokenisierung hinzufügen. Die Tokenisierung ist erforderlich, um die Tokens zu erstellen, die im Suchindex verwendet werden.
Bei der Tokenisierung werden Werte in Tokens umgewandelt. Die Methode, mit der Sie ein Dokument tokenisieren, bestimmt die Arten und die Effizienz der Suchanfragen, die Nutzer dafür ausführen können.
Spanner bietet Tokenisierer für Text in natürlicher Sprache, Teilstrings, wörtlichen Text, Zahlen und boolesche Werte. Das Datenbankschema verwendet den Tokenisierer, der dem Suchtyp entspricht, der für die Spalte erforderlich ist. Tokenisierer haben die folgenden Eigenschaften:
- Jeder Tokenisierer ist eine SQL-Funktion, die eine Eingabe wie einen String oder eine Zahl und benannte Argumente für zusätzliche Optionen erhält.
- Der Tokenisierer gibt eine
TOKENLISTaus.
Ein Textstring wie The quick brown fox jumps over the lazy dog wird beispielsweise in [the,quick,brown,fox,jumps,over,the,lazy,dog] tokenisiert.
Ein HTML-String The <b>apple</b> is <i>red</i> wird in
[the,apple,is,red] tokenisiert.
Tokens haben die folgenden Eigenschaften:
- Tokens werden in Spalten mit dem Datentyp
TOKENLISTgespeichert. - Jedes Token wird als Bytefolge mit einer optionalen Gruppe zugehöriger Attribute gespeichert. In Volltextanwendungen ist ein Token in der Regel ein einzelnes Wort aus einem Textdokument.
- Beim Tokenisieren von HTML-Werten generiert Spanner Attribute, die die Bedeutung eines Tokens im Dokument angeben. Spanner verwendet diese Attribute für die Bewertung, um wichtigere Begriffe (z. B. eine Überschrift) hervorzuheben.
Tokenisierer
Spanner unterstützt die folgenden Tokenisiererfunktionen:
Volltext-Tokenisierer (
TOKENIZE_FULLTEXT) erzeugt Tokens für ganze Wörter für Suchanfragen in natürlicher Sprache.Beispiel
Beide der folgenden Funktionen
GoogleSQL
TOKENIZE_FULLTEXT("Yellow apple") TOKENIZE_FULLTEXT("Yellow <b>apple</b>", content_type=>"text/html")PostgreSQL
In diesem Beispiel wird
spanner.tokenize_fulltextverwendet.spanner.tokenize_fulltext("Yellow apple") spanner.tokenize_fulltext('Yellow <b>apple</b>', context_type=>'text/html')erzeugen dieselben Tokens:
[yellow,apple].Teilstring-Tokenisierer (
TOKENIZE_SUBSTRING) generiert Tokens für jedes n-Gramm jedes Worts. Er wird verwendet, um Teilstrings von Wörtern in einem Text zu finden.Beispiel
GoogleSQL
TOKENIZE_SUBSTRING('hello world', ngram_size_min=>4, ngram_size_max=>6)PostgreSQL
In diesem Beispiel wird
spanner.tokenize_substringverwendet.spanner.tokenize_substring('hello world', ngram_size_min=>4, ngram_size_max=>6)Erzeugt die folgenden Tokens:
[ello,hell,hello,orld,worl,world].Der n-Gramm-Tokenisierer (
TOKENIZE_NGRAMS) generiert n-Gramme aus einer Eingabe, ohne sie in einzelne Wörter aufzuteilen. Er wird verwendet, um reguläre Ausdrucksprädikate zu beschleunigen.Beispiel
Die folgende Funktion:
GoogleSQL
TOKENIZE_NGRAMS("Big Time", ngram_size_min=>4, ngram_size_max=>4)PostgreSQL
In diesem Beispiel wird
spanner.tokenize_ngramsverwendet.spanner.tokenize_ngrams('big time', ngram_size_min=>4, ngram_size_max=>4)Erzeugt die folgenden Tokens:
["Big ","ig T","g Ti"," Tim", "Time"].Tokenisierer für genaue Übereinstimmungen (
TOKENundTOKENIZE_BOOL) werden verwendet, um Zeilen zu suchen, die einen bestimmten Wert in einer ihrer Spalten enthalten. Eine Anwendung, die beispielsweise einen Produktkatalog indexiert, kann nach Produkten einer bestimmten Marke und Farbe suchen.Beispiele
Die folgenden Funktionen:
GoogleSQL
TOKEN("hello") TOKEN(["hello", "world"])PostgreSQL
In diesem Beispiel wird
spanner.tokenverwendet.spanner.token('hello')Erzeugt die folgenden Tokens:
[hello].Die folgende Funktion:
GoogleSQL
TOKENIZE_BOOL(true)PostgreSQL
In diesem Beispiel wird
spanner.tokenize_boolverwendet.spanner.tokenize_bool(true)Erzeugt das folgende Token:
[y].Zahlentokenisierer (
TOKENIZE_NUMBER) werden verwendet, um eine Reihe von Tokens zu generieren, die die Suche nach numerischen Vergleichen beschleunigen. Bei Gleichheitsbedingungen ist das Token die Zahl selbst. Bei Bereichsbedingungen wierating >= 3.5ist die Menge der Tokens komplexer.Beispiele
Die folgenden Funktionsanweisungen:
GoogleSQL
TOKENIZE_NUMBER(42, comparison_type=>'equality') TOKENIZE_NUMBER(42, comparison_type=>'all', granularity=>10, min=>1, max=>100)PostgreSQL
In diesem Beispiel wird
spanner.tokenize_numberverwendet.spanner.tokenize_number(42, comparison_type=>'equality') spanner.tokenize_number(42, comparison_type=>'all', granularity=>10, min=>1, max=>100)Erzeugen die folgenden Tokens:
"==42"und"==42","[1,75]","[36, 45]","[36,55]","[36, 75]".JSON- und JSONB-Tokenisierer (
TOKENIZE_JSONundTOKENIZE_JSONB) werden verwendet, um eine Reihe von Tokens zu generieren, die JSON-Containment und Schlüssel-Existenz-Prädikate beschleunigen, z. B.doc[@key] IS NOT NULL(GoogleSQL) oderdoc ? 'key'(PostgreSQL).
Tokenisierungsfunktionen werden in der Regel in einem
Ausdruck für eine generierte Spalte verwendet. Diese Spalten sind als HIDDEN definiert, damit sie nicht in den Abfrageergebnissen von SELECT * enthalten sind.
Im folgenden Beispiel werden ein Volltext-Tokenisierer und ein numerischer Tokenisierer verwendet, um eine Datenbank zu erstellen, in der Namen und Bewertungen von Musikalben gespeichert werden. Die DDL-Anweisung dient zwei Zwecken:
- Definiert die Datenspalten
AlbumTitleundRating. Definiert
AlbumTitle_TokensundAlbumRating_Tokens. DieseTOKENLIST-Spalten tokenisieren die Werte in den Datenspalten, damit Spanner sie indexieren kann.GoogleSQL
CREATE TABLE Albums ( AlbumId STRING(MAX) NOT NULL, AlbumTitle STRING(MAX), Rating FLOAT64, AlbumTitle_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(AlbumTitle)) HIDDEN, Rating_Tokens TOKENLIST AS (TOKENIZE_NUMBER(Rating)) HIDDEN ) PRIMARY KEY(AlbumId);PostgreSQL
CREATE TABLE albums ( albumid character varying NOT NULL, albumtitle character varying, albumtitle_Tokens spanner.tokenlist GENERATED ALWAYS AS (spanner.tokenize_fulltext(albumtitle)) VIRTUAL HIDDEN, PRIMARY KEY(albumid));
Wenn die Basiswerte geändert werden, werden AlbumTitle_Tokens und Rating_Tokens automatisch aktualisiert.
Reinen Text oder HTML-Inhalt tokenisieren
Die Texttokenisierung unterstützt die Inhaltstypen „Reiner Text“ und „HTML“. Verwenden Sie die
Spanner TOKENIZE_FULLTEXT
Funktion, um Tokens zu erstellen. Verwenden Sie dann die
CREATE SEARCH INDEX
DDL-Anweisung, um den Suchindex zu generieren.
Die folgende DDL-Anweisung CREATE TABLE verwendet beispielsweise die Funktion TOKENIZE_FULLTEXT, um Tokens aus AlbumTitles in der Tabelle Albums zu erstellen. Die CREATE SEARCH INDEX DDL-Anweisung erstellt einen Such
index mit den neuen AlbumTitles_Tokens.
GoogleSQL
CREATE TABLE Albums (
AlbumId STRING(MAX) NOT NULL,
AlbumTitle STRING(MAX),
AlbumTitle_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(AlbumTitle)) HIDDEN
) PRIMARY KEY(AlbumId);
CREATE SEARCH INDEX AlbumsIndex ON Albums(AlbumTitle_Tokens)
PostgreSQL
CREATE TABLE albums (
albumid character varying NOT NULL,
albumtitle character varying,
albumtitle_tokens spanner.tokenlist
GENERATED ALWAYS AS (spanner.tokenize_fulltext(albumtitle)) VIRTUAL HIDDEN,
PRIMARY KEY(albumid));
CREATE SEARCH INDEX albumsindex ON albums(albumtitle_tokens)
Beim Tokenisierungsprozess werden die folgenden Regeln verwendet:
- Die Tokenisierung umfasst keine Stemming oder Korrekturfunktionen für falsch geschriebene Wörter. In einem Satz wie „A cat was looking at a group of cats“ wird das Token „cat“ beispielsweise getrennt vom Token „cats“ indexiert. Im Vergleich zu anderen Suchmaschinen, die Tokens während des Schreibens normalisieren, bietet Spanner die Möglichkeit, die Suchanfrage zu erweitern, um verschiedene Formen von Wörtern einzubeziehen. Weitere Informationen finden Sie unter Erweiterter Abfragemodus.
- Stoppwörter wie „a“ sind im Suchindex enthalten.
- Bei der Volltextsuche wird die Groß- und Kleinschreibung immer ignoriert. Beim Tokenisierungsprozess werden alle Tokens in Kleinbuchstaben umgewandelt.
Beim Tokenisierungsprozess werden die Positionen für jedes Token im Originaltext erfasst. Diese Positionen werden später verwendet, um Wortgruppen abzugleichen. Die Positionen werden zusammen mit den Dokument-IDs im Suchindex gespeichert.
Google arbeitet kontinuierlich an der Verbesserung der Tokenisierungsalgorithmen. In einigen Fällen kann dies dazu führen, dass ein String in Zukunft anders tokenisiert wird als jetzt. Wir gehen davon aus, dass solche Fälle äußerst selten sind. Ein Beispiel dafür ist eine Verbesserung der Segmentierung für chinesische, japanische und koreanische Sprachen (CJK).
Das Argument content_type gibt an, ob das Inhaltsformat reinen Text oder HTML verwendet. Verwenden Sie die folgenden Einstellungen, um content_type festzulegen:
- Setzen Sie für die Texttokenisierung das Argument
content_typeauf „text/plain“. Dies ist die Standardeinstellung. - Setzen Sie für die HTML-Tokenisierung das
content_typeArgument auf"text/html". Ohne dieses Argument werden HTML-Tags als Satzzeichen behandelt. Im HTML-Modus verwendet Spanner Heuristiken, um die Bedeutung des Texts auf der Seite abzuleiten. Dazu gehören beispielsweise, ob sich der Text in einer Überschrift befindet oder welche Schriftgröße er hat. Zu den unterstützten Attributen für HTML gehörensmall,medium,large,titleund `link`. Wie die Position wird das Attribut zusammen mit dem Token im Suchindex gespeichert. Bei der Tokenisierung werden keine Tokens für HTML-Tags erstellt.
Tokenattribute haben keine Auswirkungen auf den Abgleich oder die Ergebnisse der SEARCH oder
SEARCH_SUBSTRING Funktion. Sie werden nur für
das Ranking verwendet.
Im folgenden Beispiel wird gezeigt, wie Sie Text tokenisieren:
GoogleSQL
CREATE TABLE T (
...
Text STRING(MAX),
Html STRING(MAX),
Text_Tokens TOKENLIST
AS (TOKENIZE_FULLTEXT(Text, content_type=>"text/plain")) HIDDEN,
Html_Tokens TOKENLIST
AS (TOKENIZE_FULLTEXT(Html, content_type=>"text/html")) HIDDEN
) PRIMARY KEY(...);
PostgreSQL
CREATE TABLE t (
...
text character varying,
html character varying,
text_tokens spanner.tokenlist
GENERATED ALWAYS AS (spanner.tokenize_fulltext(text, content_type=>"text/plain")) VIRTUAL HIDDEN,
html_tokens spanner.tokenlist
GENERATED ALWAYS AS (spanner.tokenize_fulltext(html, content_type=>'type/html')) VIRTUAL HIDDEN,
PRIMARY KEY(...));
Spracherkennung mit dem Argument language_tag verfeinern
Standardmäßig wird die Eingabesprache bei der Tokenisierung automatisch erkannt. Wenn die Eingabesprache bekannt ist, kann ein language_tag-Argument verwendet werden, um dieses Verhalten zu verfeinern:
GoogleSQL
AlbumTitle_Tokens TOKENLIST
AS (TOKENIZE_FULLTEXT(AlbumTitle, language_tag=>"en-us")) HIDDEN
PostgreSQL
albumtitle_tokens spanner.tokenlist
GENERATED ALWAYS AS (spanner.tokenize_fulltext(albumtitle, language_tag=>'en-us')) VIRTUAL HIDDEN
In den meisten Anwendungen wird das Argument language_tag nicht angegeben und stattdessen auf die automatische Spracherkennung gesetzt. Für die Segmentierung für asiatische Sprachen wie Chinesisch, Koreanisch und Japanisch muss die Tokenisierungssprache nicht festgelegt werden.
Die folgenden Beispiele zeigen Fälle, in denen language_tag die Tokenisierung beeinflusst:
| Tokenisierungsfunktion | Erzeugte Tokens |
|---|---|
TOKENIZE_FULLTEXT("A tout pourquoi il y a un parce que") |
[a, tout, pourquoi, il, ya, un, parce, que] |
TOKENIZE_FULLTEXT("A tout pourquoi il y a un parce que", \ language_tag=>"fr") |
[a, tout, pourquoi, il, y, a, un, parce, que] |
TOKENIZE_FULLTEXT("旅 行") |
Zwei Tokens: [旅, 行] |
TOKENIZE_FULLTEXT("旅 行", language_tag=>"zh") |
Ein Token: [旅行] |
Nächste Schritte
- Informationen zu Suchindexen.
- Informationen zu numerischen Indexen.
- Informationen zur Indexpartitionierung.