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 damit ausführen können.
Spanner bietet Tokenisierungen für Text in natürlicher Sprache, Teilstrings, wörtlichen Text, Zahlen und boolesche Werte. Das Datenbankschema verwendet die Tokenisierung, die dem Suchtyp entspricht, der für die Spalte erforderlich ist. Tokenisierungen haben die folgenden Eigenschaften:
- Jede Tokenisierung ist eine SQL-Funktion, die eine Eingabe wie einen String oder eine Zahl und benannte Argumente für zusätzliche Optionen erhält.
- Die Tokenisierung gibt eine
TOKENLISTaus.
Beispielsweise wird der Textstring The quick brown fox jumps over the lazy dog 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.
Tokenisierungen
Spanner unterstützt die folgenden Tokenisierungsfunktionen:
Volltext-Tokenisierung (
TOKENIZE_FULLTEXT) erzeugt Tokens für ganze Wörter für Suchanfragen in natürlicher Sprache.Beispiel
Beide 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-Tokenisierung (
TOKENIZE_SUBSTRING) generiert Tokens für jedes N-Gramm jedes Worts. Sie 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].N-Gramm-Tokenisierung (
TOKENIZE_NGRAMS) generiert N-Gramme aus einer Eingabe, ohne sie in einzelne Wörter aufzuteilen. Sie 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"].Tokenisierungen für genaue Übereinstimmungen (
TOKENundTOKENIZE_BOOL) werden verwendet, um Zeilen zu suchen, die einen bestimmten Wert in einer ihrer Spalten enthalten. Beispielsweise möchte eine Anwendung, die einen Produktkatalog indexiert, 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].Zahl-Tokenisierungen (
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 aufwendiger.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-Tokenisierungen (
TOKENIZE_JSONundTOKENIZE_JSONB) werden verwendet, um eine Reihe von Tokens zu generieren, die Prädikate für JSON-Gleichheit, -Einschluss und -Schlüsselvorhandensein beschleunigen, z. B.doc.key = "value"oderdoc[@key] IS NOT NULL(GoogleSQL) unddoc->'key' = '"value"'::jsonboderdoc ? '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 eine Volltext-Tokenisierung und eine numerische Tokenisierung verwendet, um eine Datenbank zu erstellen, in der Namen und Bewertungen von Musikalben gespeichert werden. Die DDL-Anweisung führt zwei Aktionen aus:
- 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.
Nur-Text- oder HTML-Inhalt tokenisieren
Die Text-Tokenisierung unterstützt Nur-Text und HTML-Inhaltstypen. 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)
Für die Tokenisierung gelten die folgenden Regeln:
- Die Tokenisierung umfasst keine Stammbildung oder Korrektur von falsch geschriebenen Wörtern. 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 (z. B. „a“) sind im Suchindex enthalten.
- Bei der Volltextsuche wird immer nicht zwischen Groß- und Kleinschreibung unterschieden. Bei der Tokenisierung werden alle Tokens in Kleinbuchstaben umgewandelt.
Bei der Tokenisierung 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 Nur-Text oder HTML verwendet. Verwenden Sie die folgenden Einstellungen, um content_type festzulegen:
- Setzen Sie für die Text-Tokenisierung das Argument
content_typeauf "text/plain". Das 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. 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
Bei der Tokenisierung wird die Eingabesprache standardmäßig automatisch erkannt. Wenn die Eingabesprache bekannt ist, kann ein Argument language_tag 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.