Questa pagina descrive come eseguire una ricerca che mescola dati a testo intero e non di testo.
Eseguire una ricerca mista a testo intero e non di testo
Gli indici di ricerca supportano le colonne di testo completo, a corrispondenza esatta e numeriche. Puoi combinare condizioni di testo e non di testo nella clausola WHERE
in modo simile alle query di ricerca con più colonne. L'ottimizzatore delle query tenta di ottimizzare i predicati non di testo con un indice di ricerca. Se
questo non è possibile, Spanner valuta la condizione per ogni riga
che corrisponde all'indice di ricerca. Le colonne a cui viene fatto riferimento non archiviate nell'indice di ricerca vengono recuperate dalla tabella di base.
Ad esempio, considera il seguente esempio:
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;
Il comportamento delle query su questa tabella è il seguente:
Rating
eGenres
sono inclusi nell'indice di ricerca. Spanner accelera le condizioni utilizzando elenchi di posting dell'indice di ricerca.SELECT Album FROM Albums WHERE Rating > 4 AND ARRAY_INCLUDES_ANY(Genres, ['jazz'])
La query può combinare connessioni, disgiunzioni e negazioni in qualsiasi modo, incluso il mix di predicati di testo completo 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 di token per i relativi possibili valori. Pertanto, il predicato a testo intero suTitle
e il predicato non di testo suRating
vengono accelerati, ma non il predicato suLikes
. In Spanner, la query recupera tutti i documenti con il termine "auto" inTitle
e 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'indicizzazione diLikes
in modo simile aRating
consente di risparmiare risorse.SELECT Album FROM Albums WHERE SEARCH(Title_Tokens, 'car') AND Rating > 4 AND Likes >= 1000
Cover
non è memorizzato nell'indice. La seguente query esegue un join posteriore traAlbumsIndex
eAlbums
per recuperareCover
per tutti gli album corrispondenti.SELECT AlbumId, Cover FROM Albums WHERE SEARCH(Title_Tokens, 'car') AND Rating > 4
Passaggi successivi
- Scopri di più sulle query di ricerca a testo intero.
- Scopri come determinare il ranking dei risultati di ricerca.
- Scopri come eseguire una ricerca di sottostringhe.
- Scopri come paginare i risultati di ricerca.
- Scopri come eseguire ricerche in più colonne.