Teilstring-Suche durchführen

Neben der vollständigen Token-Übereinstimmung unterstützen Spanner Suchindizes auch Teilstring-Suchen. Auf dieser Seite wird beschrieben, wie Sie eine Teilstring Suche als Teil einer Volltextsuche in Spanner ausführen.

Teilstring-Suchen haben die folgenden Merkmale:

  • Die Groß-/Kleinschreibung wird nicht berücksichtigt, die meisten Satzzeichen werden verworfen und Leerzeichen werden normalisiert.
  • Keine Segmentierung für Chinesisch, Japanisch und Koreanisch (CJK), da teilweise CJK-Abfragen oft falsch segmentiert werden.
  • Bei mehreren Suchbegriffen muss das Ergebnis einen Teilstring aus jedem Begriff enthalten. Beispielsweise stimmt 'happ momen' mit "happy moment" überein, da beide Teilstrings im Text gefunden werden. Es stimmt nicht mit "happy day" überein.

Beispiele

Gespeicherter Text Teilstring-Abfrage Übereinstimmung
Bridge over Troubled Water ridg roub Ja
Bridge over Troubled Water ridg , roub Ja
Bridge over Troubled Water over brid Ja
Bridge over Troubled Water ate bridge Ja
Bridge over Troubled Water Bridge bridge bridge Ja
Bridge over Troubled Water bri trou ter Ja
Bridge over Troubled Water bri dge Ja
Bridge over Troubled Water troubledwater Nein
Bridge over Troubled Water trubled Nein

Verwenden Sie für eine Teilstring-Suche die TOKENIZE_SUBSTRING Funktion in der TOKENLIST Spaltendefinition, wie im folgenden DDL Beispiel gezeigt:

GoogleSQL

CREATE TABLE Albums (
AlbumId STRING(MAX) NOT NULL,
AlbumTitle STRING(MAX),
AlbumTitle_Tokens TOKENLIST AS (TOKENIZE_SUBSTRING(AlbumTitle)) HIDDEN
) PRIMARY KEY(AlbumId);

CREATE SEARCH INDEX AlbumsTitleIndex ON Albums(AlbumTitle_Tokens);

PostgreSQL

In diesem Beispiel wird spanner.tokenize_substring verwendet.

CREATE TABLE albums (
albumid character varying NOT NULL,
albumtitle character varying,
albumtitle_tokens spanner.tokenlist
    GENERATED ALWAYS AS (spanner.tokenize_substring(albumtitle)) VIRTUAL HIDDEN,
PRIMARY KEY(albumid));

CREATE SEARCH INDEX albumstitleindex ON albums(albumtitle_tokens);

Verwenden Sie in der SQL-Abfrage die SEARCH_SUBSTRING Funktion in der WHERE Klausel. Die folgende Abfrage stimmt beispielsweise mit einem Album mit dem Titel „happy“ aus der Tabelle überein, die im vorherigen Beispiel erstellt wurde:

GoogleSQL

SELECT AlbumId
FROM Albums
WHERE SEARCH_SUBSTRING(AlbumTitle_Tokens, 'happ');

PostgreSQL

In diesem Beispiel wird spanner.search_substring verwendet.

SELECT albumid
FROM albums
WHERE spanner.search_substring(albumtitle_tokens, 'happ');

TOKENIZE_SUBSTRING generiert n-Gramme für jedes Token und speichert diese n-Gramme im Suchindex. Die Mindest- und Höchstlänge der zu generierenden n-Gramme werden über optionale Argumente konfiguriert.

Suchindizes für Teilstrings können 10- bis 30-mal mehr Speicherplatz als Volltextindizes für dieselben Daten verwenden, da bei der Tokenisierung viel mehr Tokens entstehen. Das gilt insbesondere, wenn die Differenz zwischen ngram_size_min und ngram_size_max wächst. Teilstring-Abfragen benötigen auch mehr Ressourcen für die Ausführung.

Wie bei TOKENIZE_FULLTEXT, können Sie TOKENIZE_SUBSTRING so konfigurieren, dass bestimmte Inhaltstypen verwendet werden.

Neben der einfachen Teilstring-Suche, SEARCH_SUBSTRING unterstützt auch den relativen Suchmodus. Eine relative Suche verfeinert die Ergebnisse der Teilstring-Suche.

Wenn Sie den relativen Suchmodus aktivieren möchten, legen Sie den relative_search_types Parameter von TOKENIZE_SUBSTRING auf ein nicht leeres Array mit Elementen der unterstützten relativen Suchtypen fest.

Wenn die relative Suche bei der Tokenisierung aktiviert ist, kann SEARCH_SUBSTRING Abfragen mit den folgenden relativen Suchtypen ausführen:

  • phrase: stimmt mit zusammenhängenden Teilstrings überein

    Beispiele

    Gespeicherter Text Teilstring-Abfrage Übereinstimmung
    Bridge over Troubled Water bridge over Ja
    Bridge over Troubled Water Bridge bridge bridge Nein
    Bridge over Troubled Water brid over Nein
    Bridge over Troubled Water ridge over trouble Ja
    Bridge over Troubled Water bridge ove troubled Nein
    Bridge over Troubled Water idge ove Ja
    Bridge over Troubled Water idge , ove Ja
    Bridge over Troubled Water RIDGE OVE Ja
    Bridge over Troubled Water bridge water Nein
  • value_prefix: stimmt mit zusammenhängenden Teilstrings überein und die Übereinstimmung muss am Anfang des Werts beginnen. Dies ist konzeptionell ähnlich wie die Funktion STARTS_WITH für Strings, bei denen die Groß-/Kleinschreibung und Leerzeichen normalisiert wurden.

    Beispiele

    Gespeicherter Text Teilstring-Abfrage Übereinstimmung
    Bridge over Troubled Water bridge over Ja
    Bridge over Troubled Water bridge , over Ja
    Bridge over Troubled Water ridge over Nein
    Bridge over Troubled Water troubled water Nein
  • value_suffix: stimmt mit zusammenhängenden Teilstrings überein und die Übereinstimmung muss am Ende des Werts erfolgen. Dies ist konzeptionell ähnlich wie die Funktion ENDS_WITH für Strings, bei denen die Groß-/Kleinschreibung und Leerzeichen normalisiert wurden.

    Beispiele

    Gespeicherter Text Teilstring-Abfrage Übereinstimmung
    Bridge over Troubled Water troubled water Ja
    Bridge over Troubled Water troubled ; water Ja
    Bridge over Troubled Water roubled water Ja
    Bridge over Troubled Water troubled wate Nein
    Bridge over Troubled Water trouble water Nein
    Bridge over Troubled Water bridge over Nein
  • word_prefix: wie value_prefix, aber der String muss an einer Begriffsgrenze (und nicht an einer Wertgrenze) übereinstimmen.

    Beispiele

    Gespeicherter Text Teilstring-Abfrage Übereinstimmung
    Bridge over Troubled Water over trouble Ja
    Bridge over Troubled Water Over , trouble Ja
    Bridge over Troubled Water troub water Nein
    Bridge over Troubled Water over water Nein
    Bridge over Troubled Water ove troubled Nein
    Bridge over Troubled Water ver troubled Ja
  • word_suffix: wie value_suffix, aber der String muss am Ende einer Begriffsgrenze übereinstimmen.

    Beispiele

    Gespeicherter Text Teilstring-Abfrage Übereinstimmung
    Bridge over Troubled Water ver troubled Ja
    Bridge over Troubled Water over trouble Nein
    Bridge over Troubled Water over water Nein
    Bridge over Troubled Water ove troubled Nein

Nächste Schritte