Volltext- und Nicht-Textabfragen kombinieren

Auf dieser Seite wird beschrieben, wie Sie eine Suche ausführen, bei der Volltext- und Nicht-Textdaten kombiniert werden.

Suchindexe unterstützen Volltext-, genau passende und numerische Spalten. Ähnlich wie bei Suchanfragen mit mehreren Spalten können Sie in der WHERE-Klausel Text- und Nicht-Textbedingungen kombinieren. Der Abfrageoptimierer versucht, Prädikate ohne Text mit einem Suchindex zu optimieren. Ist das nicht möglich, prüft Spanner die Bedingung für jede Zeile, die mit dem Suchindex übereinstimmt. Auf Spalten, die nicht im Suchindex gespeichert sind, wird aus der Basistabelle zugegriffen.

Betrachten Sie beispielsweise das folgende Beispiel:

CREATE TABLE Albums (
  AlbumId STRING(MAX) NOT NULL,
  Title STRING(MAX),
  Rating FLOAT64,
  Genres ARRAY<STRING(MAX)>,
  Likes INT64,
  Cover BYTES(MAX),
  Title_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(Title)) HIDDEN,
  Rating_Tokens TOKENLIST AS (TOKENIZE_NUMBER(Rating)) HIDDEN,
  Genres_Tokens TOKENLIST AS (TOKEN(Genres)) HIDDEN
) PRIMARY KEY(AlbumId);

CREATE SEARCH INDEX AlbumsIndex
ON Albums(Title_Tokens, Rating_Tokens, Genres_Tokens)
STORING Likes;

Das Verhalten von Abfragen für diese Tabelle ist:

  • Rating und Genres sind im Suchindex enthalten. Spanner beschleunigt Bedingungen mithilfe von Suchindex-Postinglisten.

    SELECT Album
    FROM Albums
    WHERE Rating > 4
      AND ARRAY_INCLUDES_ANY(Genres, ['jazz'])
    
  • In der Abfrage können Konjunktionen, Disjunktionen und Negationen beliebig kombiniert werden, einschließlich der Kombination von Volltext- und Nicht-Text-Prädikaten. Diese Abfrage wird vollständig durch den Suchindex beschleunigt.

    SELECT Album
    FROM Albums
    WHERE (SEARCH(Title_Tokens, 'car')
           OR Rating > 4)
      AND NOT ARRAY_INCLUDES_ANY(Genres, ['jazz'])
    
  • Likes wird im Index gespeichert, aber das Schema fordert Spanner nicht auf, einen Tokenindex für die möglichen Werte zu erstellen. Daher werden das Volltextprädikat für Title und das Nicht-Textprädikat für Rating beschleunigt, das Prädikat für Likes jedoch nicht. In Spanner werden mit der Abfrage alle Dokumente mit dem Begriff „Auto“ in der Title abgerufen, die eine Bewertung von über 4 haben. Anschließend werden Dokumente herausgefiltert, die nicht mindestens 1.000 „Mag ich“-Bewertungen haben. Diese Abfrage beansprucht viele Ressourcen, wenn fast alle Alben den Begriff „Auto“ im Titel haben und fast alle eine Bewertung von 5 haben, aber nur wenige Alben 1.000 Mag ich-Bewertungen haben. In solchen Fällen können Sie Ressourcen sparen, indem Sie Likes ähnlich wie Rating indexieren.

    SELECT Album
    FROM Albums
    WHERE SEARCH(Title_Tokens, 'car')
      AND Rating > 4
      AND Likes >= 1000
    
  • Cover ist nicht im Index gespeichert. Bei der folgenden Abfrage wird ein Back-Join zwischen AlbumsIndex und Albums ausgeführt, um Cover für alle übereinstimmenden Alben abzurufen.

    SELECT AlbumId, Cover
    FROM Albums
    WHERE SEARCH(Title_Tokens, 'car')
      AND Rating > 4
    

Nächste Schritte