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:
- Die ersten Suchergebnisse abrufen: Es wird eine Textsuche nach „foo“ in der Spalte
Title_Tokens
der TabelleAlbums
durchgeführt. - Facettenanzahl berechnen: Anschließend werden die Anzahlen für die Facetten
Rating
undGenres
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 aussearch_results
ausgewählt, sortiert nachLikes
undAlbumId
. Das sieht der Nutzer am Anfang. - Mit der Unterabfrage
rating_counts
werden die Facettenanzahlen fürRating
berechnet. Sie gruppiert alle Datensätze insearch_results
nach ihremRating
-Wert und zählt, wie viele Ergebnisse in jede Bewertungskategorie fallen. - Mit der Unterabfrage
genres_counts
werden die Facettenanzahlen fürGenres
berechnet. Da es sich um ein Array handelt, müssen Sie es mitUNNEST(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.