Tokenisierung

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 TOKENLIST aus.

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 TOKENLIST gespeichert.
  • 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_fulltext verwendet.

    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_substring verwendet.

    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_ngrams verwendet.

    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 (TOKEN und TOKENIZE_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.token verwendet.

    spanner.token('hello')
    

    Erzeugt die folgenden Tokens: [hello].

    Die folgende Funktion:

    GoogleSQL

    TOKENIZE_BOOL(true)
    

    PostgreSQL

    In diesem Beispiel wird spanner.tokenize_bool verwendet.

    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 wie rating >= 3.5 ist 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_number verwendet.

    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_JSON und TOKENIZE_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" oder doc[@key] IS NOT NULL (GoogleSQL) und doc->'key' = '"value"'::jsonb oder doc ? '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:

  1. Definiert die Datenspalten AlbumTitle und Rating.
  2. Definiert AlbumTitle_Tokens und AlbumRating_Tokens. Diese TOKENLIST-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_type auf "text/plain". Das ist die Standardeinstellung.
  • Setzen Sie für die HTML-Tokenisierung das content_type Argument 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ö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 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