Questa pagina descrive come utilizzare i facet per una ricerca full-text. Nell'ambito del filtraggio interattivo, un aspetto è un potenziale valore del filtro e il conteggio delle corrispondenze per quel filtro. Sui siti web con questa funzionalità, quando inserisci una frase di ricerca, viene visualizzato un elenco di risultati nel menu di navigazione e un elenco di sfaccettature che puoi utilizzare per restringere i risultati di ricerca, insieme al numero di risultati che rientrano in ogni categoria.
Ad esempio, se utilizzi la query "foo" per cercare album, potresti ottenere centinaia di risultati. Se è presente una sfaccettatura dei generi, puoi selezionare i generi come "rock (250)", "r&b (50)" o "pop (150)".
Nella ricerca full-text di Spanner, puoi utilizzare espressioni SQL standard e funzioni di ricerca full-text sia per il filtraggio che per il conteggio filtrato. Non è necessario utilizzare una sintassi speciale per utilizzare i facet.
Aggiungi facet da utilizzare per le ricerche full-text
L'esempio seguente crea una tabella per gli album e tokenizza il titolo di ciascun album. Questa tabella viene utilizzata per gli esempi in questa pagina.
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));
Crea un indice di ricerca su Title_Tokens
. Se vuoi, puoi archiviare Title
,
Genres
e Rating
nell'indice di ricerca per evitare un backjoin alla tabella di base
durante il calcolo delle sfaccettature.
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
Per questo esempio, inserisci i seguenti dati nella tabella.
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)
Recuperare i valori di conteggio per un singolo facet
Questo esempio mostra come eseguire un conteggio dei facet su un facet Valutazione. Esegue una ricerca di testo di "foo" all'interno della colonna Title_Tokens della tabella Albums.
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 |
Recuperare i valori di conteggio per più facet
Questo esempio mostra i passaggi per eseguire il conteggio delle sfaccettature su più sfaccettature. Esegue le seguenti operazioni:
- Recupera i risultati di ricerca iniziali: esegue una ricerca di testo per "foo"
all'interno della colonna
Title_Tokens
della tabellaAlbums
. - Calcola i conteggi delle sfaccettature: calcola quindi i conteggi per le sfaccettature
Rating
eGenres
.
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
Nello specifico, questo esempio esegue le seguenti operazioni:
WITH search_results AS (...)
raccoglie un ampio insieme di risultati di ricerca iniziali da utilizzare per la prima pagina dei risultati e per i calcoli delle sfaccettature.SEARCH(Title_Tokens, "foo")
è la query di ricerca principale.LIMIT 10000
limita il costo della ricerca riducendo il set di risultati a 10.000. Per le ricerche molto ampie che potrebbero restituire milioni di risultati, il calcolo dei conteggi esatti delle sfaccettature sull'intero set di dati può essere costoso. Limitando i risultati di ricerca, la query può fornire rapidamente conteggi approssimativi (limite inferiore) delle sfaccettature. Ciò significa che i conteggi riflettono almeno quel numero di risultati, ma potrebbero esserci altri risultati corrispondenti oltre il limite di 10.000.- La sottoquery
result_page
produce la prima pagina dei risultati di ricerca visualizzati dall'utente. Seleziona solo i primi 50 record disearch_results
, ordinati perLikes
eAlbumId
. Questo è ciò che l'utente vede inizialmente. - La sottoquery
rating_counts
calcola i conteggi delle sfaccettature perRating
. Raggruppa tutti i record insearch_results
in base alRating
e conta quanti risultati rientrano in ogni categoria di valutazione. - La sottoquery
genres_counts
calcola i conteggi delle sfaccettature perGenres
. Poiché si tratta di un array, uniscilo conUNNEST(Genres)
per trattare ogni genere all'interno dell'array come una riga separata per il conteggio.
Recuperare le pagine successive
Quando esegui query per le pagine successive dopo la query sui facet iniziale, puoi riutilizzare i conteggi dei facet restituiti dalla prima pagina.
Per saperne di più sull'impaginazione, consulta Utilizzare l'impaginazione basata sulle chiavi.