Questa pagina descrive come eseguire una ricerca che combina dati di testo e non di testo.
Eseguire una ricerca mista a testo intero e non testuale
Gli indici di ricerca supportano
le colonne numeriche, JSON/JSONB, a corrispondenza esatta e full-text. Puoi combinare
condizioni di testo e non di testo nella clausola WHERE in modo simile alle query di ricerca
multicolonna. Lo strumento di ottimizzazione delle query tenta di ottimizzare i predicati non di testo con un
indice di ricerca. Se ciò non è possibile, Spanner valuta la
condizione per ogni riga che corrisponde all'indice di ricerca. Le colonne a cui viene fatto riferimento non
memorizzate nell'indice di ricerca vengono recuperate dalla tabella di base.
Considera l'esempio seguente:
GoogleSQL
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);
PostgreSQL
Il supporto di Spanner PostgreSQL presenta le seguenti limitazioni:
- La funzione
spanner.tokenize_numbersupporta solo il tipobigint. spanner.tokennon supporta la tokenizzazione degli array.
CREATE TABLE albums (
albumid character varying NOT NULL,
title character varying,
rating bigint,
genres character varying NOT NULL,
likes bigint,
cover bytea,
title_tokens spanner.tokenlist AS (spanner.tokenize_fulltext(title)) VIRTUAL HIDDEN,
rating_tokens spanner.tokenlist AS (spanner.tokenize_number(rating)) VIRTUAL HIDDEN,
genres_tokens spanner.tokenlist AS (spanner.token(genres)) VIRTUAL HIDDEN,
PRIMARY KEY(albumid));
CREATE SEARCH INDEX albumsindex
ON albums(title_tokens, rating_tokens, genres_tokens)
INCLUDE (likes);
Il comportamento delle query su questa tabella include quanto segue:
RatingeGenressono inclusi nell'indice di ricerca. Spanner accelera le condizioni utilizzando gli elenchi di posting dell'indice di ricerca.ARRAY_INCLUDES_ANY,ARRAY_INCLUDES_ALLsono funzioni GoogleSQL e non sono supportate per il dialetto PostgreSQL.SELECT Album FROM Albums WHERE Rating > 4 AND ARRAY_INCLUDES_ANY(Genres, ['jazz'])La query può combinare congiunzioni, disgiunzioni e negazioni in qualsiasi modo, inclusa la combinazione di predicati full-text e non di testo. Questa query è completamente accelerata dall'indice di ricerca.
SELECT Album FROM Albums WHERE (SEARCH(Title_Tokens, 'car') OR Rating > 4) AND NOT ARRAY_INCLUDES_ANY(Genres, ['jazz'])Likesè archiviato nell'indice, ma lo schema non richiede a Spanner di creare un indice dei token per i suoi possibili valori. Pertanto, il predicato full-text suTitlee il predicato non di testo suRatingvengono accelerati, ma il predicato suLikesno. In Spanner, la query recupera tutti i documenti con il termine "auto" nel campoTitlee una valutazione superiore a 4, quindi filtra i documenti che non hanno almeno 1000 Mi piace. Questa query utilizza molte risorse se quasi tutti gli album contengono il termine "auto" nel titolo e quasi tutti hanno una valutazione di 5, ma pochi album hanno 1000 Mi piace. In questi casi, l'indicizzazioneLikesin modo simile aRatingconsente di risparmiare risorse.GoogleSQL
SELECT Album FROM Albums WHERE SEARCH(Title_Tokens, 'car') AND Rating > 4 AND Likes >= 1000PostgreSQL
SELECT album FROM albums WHERE spanner.search(title_tokens, 'car') AND rating > 4 AND likes >= 1000Covernon è memorizzato nell'indice. La seguente query esegue un back join traAlbumsIndexeAlbumsper recuperareCoverper tutti gli album corrispondenti.GoogleSQL
SELECT AlbumId, Cover FROM Albums WHERE SEARCH(Title_Tokens, 'car') AND Rating > 4PostgreSQL
SELECT albumid, cover FROM albums WHERE spanner.search(title_tokens, 'car') AND rating > 4
Passaggi successivi
- Scopri di più sulle query di ricerca full-text.
- Scopri come classificare i risultati di ricerca.
- Scopri come eseguire una ricerca di sottostringa.
- Scopri come impaginare i risultati di ricerca.
- Scopri come cercare in più colonne.