Mit Attributen suchen

Auf dieser Seite wird beschrieben, wie Sie Facetten für eine Volltextsuche verwenden. Im Rahmen des interaktiven Filterns ist ein Facette ein potenzieller Filterwert und die Anzahl der Übereinstimmungen für diesen Filter. Wenn Sie auf Websites mit dieser Funktion einen Suchbegriff eingeben, wird im Navigationsmenü eine Liste mit Ergebnissen angezeigt. Außerdem gibt es eine Liste mit Facetten, mit denen Sie die Suchergebnisse eingrenzen können, sowie die Anzahl der Ergebnisse, die in jede Kategorie passen.

Wenn Sie beispielsweise mit der Anfrage „foo“ nach Alben suchen, erhalten Sie möglicherweise Hunderte von Ergebnissen. Wenn es eine Genre-Dimension gibt, können Sie nach Genres wie „Rock (250)“, „R&B (50)“ oder „Pop (150)“ filtern.

In der Spanner-Volltextsuche können Sie Standard-SQL-Ausdrücke und Volltextsuchfunktionen sowohl zum Filtern als auch zum gefilterten Zählen verwenden. Für die Verwendung von Facetten ist keine spezielle Syntax erforderlich.

Attribute für Volltextsuchen hinzufügen

Im folgenden Beispiel wird eine Tabelle für Alben erstellt und der Titel für jedes Album tokenisiert. Diese Tabelle wird für Beispiele auf dieser Seite verwendet.

GoogleSQL

CREATE TABLE Albums (
  AlbumId INT64 NOT NULL,
  Title STRING(MAX),
  Rating INT64,
  Genres ARRAY<STRING(MAX)>,
  Likes INT64 NOT NULL,
  Title_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(Title)) HIDDEN,
) PRIMARY KEY(AlbumId);

PostgreSQL

CREATE TABLE albums (
  albumid bigint NOT NULL,
  title text,
  rating bigint,
  genres text[],
  likes bigint NOT NULL,
  title_tokens spanner.TOKENLIST GENERATED ALWAYS AS (spanner.TOKENIZE_FULLTEXT(Title)) VIRTUAL HIDDEN,
PRIMARY KEY(albumid));

Erstellen Sie einen Suchindex für Title_Tokens. Optional können Sie Title, Genres und Rating im Suchindex speichern, um beim Berechnen von Facetten einen Backjoin zur Basistabelle zu vermeiden.

GoogleSQL

CREATE SEARCH INDEX AlbumsIndex
ON Albums (Title_Tokens)
STORING (Title, Genres, Rating)
ORDER BY Likes DESC;

PostgreSQL

CREATE SEARCH INDEX albumsindex
ON albums (title_tokens)
INCLUDE (title, genres, rating)
ORDER BY likes DESC

Fügen Sie für dieses Beispiel die folgenden Daten in die Tabelle ein.

GoogleSQL

INSERT INTO Albums (AlbumId, Title, Rating, Genres, Likes) VALUES
(1, "The Foo Strike Again", 5, ["Rock", "Alternative"], 600),
(2, "Who are the Who?", 5, ["Progressive", "Indie"], 200),
(3, "No Foo For You", 4, ["Metal", "Alternative"], 50)

PostgreSQL

INSERT INTO albums (albumid, title, rating, genres, likes) VALUES
(1, 'The Foo Strike Again', 5,'{"Rock", "Alternative"}', 600),
(2, 'Who are the Who?', 5,'{"Progressive", "Indie"}', 200),
(3, 'No Foo For You', 4,'{"Metal", "Alternative"}', 50)

Anzahlwerte für eine einzelne Facette abrufen

In diesem Beispiel wird gezeigt, wie Sie die Anzahl der Facetten für eine „Rating“-Facette ermitteln. Es wird eine Textsuche nach „foo“ in der Spalte „Title_Tokens“ der Tabelle „Albums“ durchgeführt.

GoogleSQL

SELECT Rating, COUNT(*) AS result_count
FROM Albums
WHERE SEARCH(Title_Tokens, "foo")
GROUP BY Rating
ORDER BY Rating DESC

| Rating | result_count |
|--------|--------------|
| 5      | 1            |
| 4      | 1            |

PostgreSQL

SELECT rating, COUNT(*) AS result_count
FROM albums
WHERE spanner.SEARCH(title_tokens, 'foo')
GROUP BY rating
ORDER BY rating DESC;

| rating | result_count |
|--------|--------------|
| 5      | 1            |
| 4      | 1            |

Anzahlwerte für mehrere Facetten abrufen

In diesem Beispiel wird gezeigt, wie Sie die Anzahl der Facetten für mehrere Facetten ermitteln. Dabei wird Folgendes ausgeführt:

  1. Die ersten Suchergebnisse abrufen: Es wird eine Textsuche nach „foo“ in der Spalte Title_Tokens der Tabelle Albums durchgeführt.
  2. Facettenanzahl berechnen: Anschließend werden die Anzahlen für die Facetten Rating und Genres berechnet.

GoogleSQL

WITH search_results AS (
  SELECT AlbumId, Title, Genres, Rating, Likes
  FROM Albums
  WHERE SEARCH(Title_Tokens, "foo")
  ORDER BY Likes DESC, AlbumId
  LIMIT 10000
)

SELECT
-- Result set #1: First page of search results
ARRAY(
  SELECT AS STRUCT *
  FROM search_results
  ORDER BY Likes DESC, AlbumId
  LIMIT 50
) as result_page,
-- Result set #2: Number of results by rating
ARRAY(
  SELECT AS STRUCT Rating, COUNT(*) as result_count
  FROM search_results
  GROUP BY Rating
  ORDER BY result_count DESC, Rating DESC
) as rating_counts,
-- Result set #3: Number of results for top 5 genres
ARRAY(
  SELECT AS STRUCT genre, COUNT(*) as result_count
  FROM search_results
  JOIN UNNEST(Genres) genre
  GROUP BY genre
  ORDER BY result_count DESC, genre
  LIMIT 5
) as genres_counts

PostgreSQL

WITH search_results AS (
  SELECT albumid, title, genres, rating, likes
  FROM albums
  WHERE spanner.SEARCH(title_tokens, 'foo')
  ORDER BY likes DESC, albumid
  LIMIT 10000
)

-- The pattern ARRAY(SELECT TO_JSONB ...) enables returning multiple nested
-- result sets in the same query.
SELECT
  -- Result set #1: First page of search results
  ARRAY(
  SELECT JSONB_BUILD_OBJECT(
    'albumid', albumid,
    'title', title,
    'genres', genres,
    'rating', rating,
    'likes', likes
    )
  FROM search_results
  ORDER BY likes DESC, albumid
  LIMIT 50
) as result_page,
-- Result set #2: Number of results by rating
ARRAY(
  SELECT JSONB_BUILD_OBJECT(
    'rating', rating,
    'result_count', COUNT(*)
    )
  FROM search_results
  GROUP BY rating
  ORDER BY COUNT(*) DESC, rating DESC
) as rating_counts,
-- Result set #3: Number of results for top 5 genres
ARRAY(
  SELECT JSONB_BUILD_OBJECT(
    'genre', genre,
    'result_count', COUNT(*)
    )
  FROM
    search_results,
    UNNEST(genres) AS genre
  GROUP BY genre
  ORDER BY COUNT(*) DESC, genre
  LIMIT 5
) as genres_counts

In diesem Beispiel wird Folgendes ausgeführt:

  • WITH search_results AS (...) ruft eine große Menge an ersten Suchergebnissen ab, die für die erste Ergebnisseite und die Attributberechnungen verwendet werden.
  • SEARCH(Title_Tokens, "foo") ist die primäre Suchanfrage.
  • LIMIT 10000 begrenzt die Kosten der Suche,indem die Ergebnismenge auf 10.000 reduziert wird. Bei sehr allgemeinen Suchanfragen, die möglicherweise Millionen von Ergebnissen zurückgeben, kann die Berechnung der genauen Facettenanzahl für das gesamte Dataset kostspielig sein. Durch die Begrenzung der Suchergebnisse kann die Abfrage schnell ungefähre (Untergrenze) Facettenanzahlen liefern. Die Anzahl der Ergebnisse entspricht also mindestens dieser Zahl, es kann aber auch mehr passende Ergebnisse geben,die über das Limit von 10.000 hinausgehen.
  • Mit der Unterabfrage result_page wird die erste Seite mit Suchergebnissen generiert, die dem Nutzer angezeigt wird. Es werden nur die 50 wichtigsten Datensätze aus search_results ausgewählt, sortiert nach Likes und AlbumId. Das sieht der Nutzer am Anfang.
  • Mit der Unterabfrage rating_counts werden die Facettenanzahlen für Rating berechnet. Sie gruppiert alle Datensätze in search_results nach ihrem Rating-Wert und zählt, wie viele Ergebnisse in jede Bewertungskategorie fallen.
  • Mit der Unterabfrage genres_counts werden die Facettenanzahlen für Genres berechnet. Da es sich um ein Array handelt, müssen Sie es mit UNNEST(Genres) verknüpfen, damit jedes Genre im Array als separate Zeile für die Zählung behandelt wird.

Nachfolgende Seiten abrufen

Wenn Sie nach der ersten Facettenabfrage nach nachfolgenden Seiten suchen, können Sie die von der ersten Seite zurückgegebenen Facettenanzahlen wiederverwenden.

Weitere Informationen zur Paginierung finden Sie unter Schlüsselbasierte Paginierung verwenden.