Tokenisierung

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 und TOKENIZE_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:

  1. Hier werden die Datenspalten AlbumTitle und Rating definiert.
  2. AlbumTitle_Tokens und AlbumRating_Tokens werden definiert. In diesen TOKENLIST-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ören small, 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