Auf dieser Seite wird beschrieben, wie Sie Tabellen die 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 Tokenisierer für Text in natürlicher Sprache, Teilstrings, wörtlichen Text, Zahlen und Boolesche Werte. Im Datenbankschema wird der Tokenisierer verwendet, der der für die Spalte erforderlichen Suchanfrage entspricht. Tokenisierer haben folgende 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 ein
TOKENLIST
aus.
Beispiel: Ein Textstring The quick brown fox jumps over the lazy dog
wird 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 folgende Eigenschaften:
- Tokens werden in Spalten mit dem Datentyp
TOKENLIST
gespeichert. - Jedes Token wird als Bytefolge mit optionalen zugehörigen Attributen gespeichert. In Volltextanwendungen ist ein Token beispielsweise 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) zu verstärken.
Tokenizer
Spanner unterstützt die folgenden Tokenisierungsfunktionen:
Der Volltext-Tokenisierer (
TOKENIZE_FULLTEXT
) generiert Wort-Tokens für Suchanfragen in natürlicher Sprache.Beispiel
Beide der folgenden Funktionen
TOKENIZE_FULLTEXT("Yellow apple") TOKENIZE_FULLTEXT("Yellow <b>apple</b>", content_type=>"text/html")
dieselben Tokens erzeugen:
[yellow,apple]
.Der Substring-Tokenisierer (
TOKENIZE_SUBSTRING
) generiert Tokens für jedes N-Gramm jedes Wortes. Mit dieser Funktion können Sie Substrings von Wörtern in einem Text finden.Beispiel
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. Sie wird verwendet, um reguläre Ausdrucksprädikate zu beschleunigen.Beispiel
Die folgende Funktion:
TOKENIZE_NGRAMS("Big Time", ngram_size_min=>4, ngram_size_max=>4)
Erzeugt die folgenden Tokens:
["Big ","ig T","g Ti"," Tim", "Time"]
.Mit Tokenisierern für genaue Übereinstimmungen (
TOKEN
undTOKENIZE_BOOL
) können Sie Zeilen mit einem bestimmten Wert in einer ihrer Spalten suchen. Beispielsweise kann in einer Anwendung, die einen Produktkatalog indexiert, nach Produkten einer bestimmten Marke und Farbe gesucht werden.Beispiele
Die folgenden Funktionen:
TOKEN("hello") TOKEN(["hello", "world"])
Die folgenden Tokens werden jeweils generiert:
[hello]
und[hello,world]
.Die folgende Funktion:
TOKENIZE_BOOL(true)
Das folgende Token wird generiert:
[y]
.Mit Zahlen-Tokenisierern (
TOKENIZE_NUMBER
) werden eine Reihe von Tokens generiert, die numerische Vergleichssuchen beschleunigen. Bei Gleichheitsbedingungen ist das Token die Zahl selbst. Bei Bereichsbedingungen (z. B.rating >= 3.5
) ist die Token-Anzahl umfangreicher.Beispiele
Die folgenden Funktionsanweisungen:
TOKENIZE_NUMBER(42, comparison_type=>"equality") TOKENIZE_NUMBER(42, comparison_type=>"all", granularity=>10, min=>1, max=>100)
Die folgenden Tokens werden jeweils generiert:
"==42"
und"==42"
,"[1,75]"
,"[36, 45]"
,"[36,55]"
,"[36, 75]"
.
Tokenisierungsfunktionen werden in der Regel in einem Ausdruck für eine generierte Spalte verwendet. Diese Spalten sind als HIDDEN
definiert, sodass sie nicht in SELECT *
-Abfrageergebnissen enthalten sind.
Im folgenden Beispiel werden ein Volltext- und ein numerischer Tokenisierer verwendet, um eine Datenbank zu erstellen, in der Namen und Bewertungen von Musikalben gespeichert werden. Die DDL-Anweisung bewirkt zwei Dinge:
- Hier werden die Datenspalten
AlbumTitle
undRating
definiert. AlbumTitle_Tokens
undAlbumRating_Tokens
werden definiert. In diesenTOKENLIST
-Spalten werden die Werte in den Datenspalten tokenisiert, damit Spanner sie indexieren kann.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);
Wenn die Basiswerte geändert werden, werden AlbumTitle_Tokens
und Rating_Tokens
automatisch aktualisiert.
Nur-Text oder HTML-Inhalt tokenisieren
Die Texttokenisierung unterstützt Nur-Text- und HTML-Inhaltstypen. Verwenden Sie die Spanner-Funktion TOKENIZE_FULLTEXT
, um Tokens zu erstellen. Verwenden Sie dann die DDL-Anweisung CREATE SEARCH INDEX
, um den Suchindex zu generieren.
In der folgenden CREATE TABLE
-DDL-Anweisung wird beispielsweise die Funktion TOKENIZE_FULLTEXT
verwendet, um Tokens aus AlbumTitles
in der Tabelle Albums
zu erstellen. Mit der DDL-Anweisung CREATE SEARCH INDEX
wird ein Suchindex mit der neuen AlbumTitles_Tokens
erstellt.
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)
Für die Tokenisierung gelten die folgenden Regeln:
- Die Tokenisierung umfasst weder Stemming noch die Korrektur von falsch geschriebenen Wörtern. In einem Satz wie „Eine Katze sah sich eine Gruppe von Katzen an“ wird das Token „Katze“ beispielsweise getrennt vom Token „Katzen“ indexiert. Im Vergleich zu anderen Suchmaschinen, die Tokens beim Schreiben normalisieren, bietet Spanner die Möglichkeit, die Suchanfrage um verschiedene Wortformen zu erweitern. Weitere Informationen finden Sie unter Erweiterter Abfragemodus.
- Stoppwörter wie „ein“ sind im Suchindex enthalten.
- Bei der Volltextsuche wird die Groß- und Kleinschreibung immer ignoriert. Bei der Tokenisierung werden alle Tokens in Kleinbuchstaben umgewandelt.
Bei der Tokenisierung werden die Positionen jedes Tokens im Originaltext erfasst. Diese Positionen werden später zum Abgleichen von Wortgruppen verwendet. Die Positionen werden im Suchindex zusammen mit den Dokument-IDs 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 extrem selten sind. Ein Beispiel hierfür ist eine Verbesserung bei der Segmentierung von Chinesisch, Japanisch und Koreanisch (CJK).
Mit dem Argument content_type
wird angegeben, ob im Inhaltsformat reiner Text oder HTML verwendet wird. Verwenden Sie die folgenden Einstellungen, um die content_type
festzulegen:
- Legen Sie für die Texttokenisierung das Argument
content_type
auf „text/plain
“ fest. Dies ist die Standardeinstellung. - Legen Sie für die HTML-Tokenisierung das
content_type
-Argument auf"text/html
fest. Ohne dieses Argument werden HTML-Tags als Satzzeichen behandelt. Im HTML-Modus verwendet Spanner Heuristiken, um zu ermitteln, wie gut sichtbar der Text auf der Seite ist. Beispielsweise, ob der Text in einer Überschrift steht oder welche Schriftgröße er hat. Zu den unterstützten HTML-Attributen gehörensmall
,medium
,large
,title
und „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 die Übereinstimmung oder die Ergebnisse der Funktion SEARCH
oder SEARCH_SUBSTRING
. Sie werden nur für das Ranking verwendet.
Im folgenden Beispiel wird gezeigt, wie Text tokenisiert wird:
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(...);
Spracherkennung mit dem Argument language_tag
verfeinern
Bei der Tokenisierung wird die Eingabesprache standardmäßig automatisch erkannt. Wenn die Eingabesprache bekannt ist, kann dieses Verhalten mit einem language_tag
-Argument verfeinert werden:
AlbumTitle_Tokens TOKENLIST
AS (TOKENIZE_FULLTEXT(AlbumTitle, language_tag=>"en-us")) HIDDEN
In den meisten Anwendungen wird das Argument language_tag
nicht angegeben und stattdessen auf die automatische Spracherkennung zurückgegriffen. Für die Segmentierung asiatischer Sprachen wie Chinesisch, Koreanisch und Japanisch muss die Tokenisierungssprache nicht festgelegt werden.
In den folgenden Beispielen wird gezeigt, wie sich die language_tag
auf die Tokenisierung auswirkt:
Tokenisierungsfunktion | Erstellte 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
- Weitere Informationen zu Suchindexen
- Weitere Informationen zu numerischen Indexen
- Weitere Informationen zur Indexpartitionierung