In questa pagina viene descritto come eseguire una ricerca che combina testo completo e non testuale e i dati di Google Cloud.
Eseguire una ricerca mista a testo intero e non di testo
Supporto della funzione Cerca negli indici
a testo intero, 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. La
lo strumento di ottimizzazione delle query cerca di ottimizzare i predicati non testuali con un indice di ricerca. Se
impossibile, Spanner valuta la condizione per ogni riga
che corrisponde all'indice di ricerca. Le colonne a cui si fa riferimento non archiviate nell'indice di ricerca vengono recuperate dalla tabella di base.
Considera ad esempio il seguente:
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 in questa tabella include quanto segue:
Rating
eGenres
sono inclusi nell'indice di ricerca. Spanner accelera le condizioni utilizzando gli elenchi di posting dell'indice di ricerca.SELECT Album FROM Albums WHERE Rating > 4 AND ARRAY_INCLUDES_ANY(Genres, ['jazz'])
La query può combinare congiunzioni, disgiunzioni e negazioni in qualsiasi modo, compresa la combinazione di predicati di testo completo e non testuali. 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. Di conseguenza, il predicato integrale suTitle
e il predicato non testuale suRating
è accelerato, ma il predicato suLikes
non lo è. 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'indicizzazioneLikes
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 classificare i risultati di ricerca.
- Scopri come eseguire una ricerca di sottostringhe.
- Scopri come paginare i risultati di ricerca.
- Scopri come cercare in più colonne.