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

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

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

    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_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].

  • 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_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"].

  • Tokenisierer für genaue Übereinstimmungen (TOKEN und TOKENIZE_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.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].

  • 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 wie rating >= 3.5 ist 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_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-Tokenisierer (TOKENIZE_JSON und TOKENIZE_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) 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 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:

  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.

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_type auf „text/plain“. Dies 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. 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ö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

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