Eseguire una ricerca utilizzando i facet

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:

  1. Recupera i risultati di ricerca iniziali: esegue una ricerca di testo per "foo" all'interno della colonna Title_Tokens della tabella Albums.
  2. Calcola i conteggi delle sfaccettature: calcola quindi i conteggi per le sfaccettature Rating e Genres.

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 di search_results, ordinati per Likes e AlbumId. Questo è ciò che l'utente vede inizialmente.
  • La sottoquery rating_counts calcola i conteggi delle sfaccettature per Rating. Raggruppa tutti i record in search_results in base al Rating e conta quanti risultati rientrano in ogni categoria di valutazione.
  • La sottoquery genres_counts calcola i conteggi delle sfaccettature per Genres. Poiché si tratta di un array, uniscilo con UNNEST(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.