Questa pagina descrive come concatenare TOKENLIST
in un oggetto
indice di ricerca quando configuri lo schema
o in una query di ricerca quando esegui una ricerca a testo intero in Spanner.
Combinare i TOKENLIST in un indice di ricerca
A volte potresti aver bisogno della tua applicazione per eseguire ricerche in singoli campi. Altre volte, l'applicazione deve eseguire ricerche in tutti i campi. Ad esempio, nel una tabella con due colonne di stringa, potresti volere che l'applicazione cerchi in entrambe le colonne senza distinguere la colonna da cui provengono le corrispondenze.
In Spanner, puoi farlo in due modi:
- Tokenizza le parole separatamente e concatena i valori
TOKENLIST
risultanti (opzione consigliata). - Concatena le stringhe e tokenizza il risultato.
Con il secondo approccio, ci sono due problemi:
- Se vuoi indicizzare
Title
oStudio
singolarmente, oltre a l'indicizzazione in una combinazioneTOKENLIST
, lo stesso testo viene tokenizzato due volte. Ciò fa sì che le transazioni utilizzino più risorse. - Una ricerca di frasi interessa entrambi i campi. Ad esempio, se
@p
è impostato su"Blue Note"
, corrisponde a una riga che contiene siaTitle
="Big Blue Note" cheStudio
="Blue Note Studios".
Il primo approccio risolve questi problemi perché una frase corrisponde a un solo campo
e ogni campo di stringa viene tokenizzato una sola volta se sia il singolo sia il combinato
TOKENLIST
sono indicizzati. Anche se ogni campo stringa viene tokenizzato una sola volta,
i TOKENLIST risultanti vengono memorizzati separatamente nell'indice.
Tokenizza le parole separatamente e concatena i valori TOKENLIST
L'esempio seguente tokenizza ogni parola e concatena TOKENLIST
valori:
CREATE TABLE Albums (
AlbumId STRING(MAX) NOT NULL,
Title STRING(MAX),
Studio STRING(MAX),
Title_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(Title)) HIDDEN,
Studio_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(Studio)) HIDDEN,
Combined_Tokens TOKENLIST AS (TOKENLIST_CONCAT([Title_Tokens, Studio_Tokens])) HIDDEN,
) PRIMARY KEY(AlbumId);
CREATE SEARCH INDEX AlbumsIndex ON Albums(Combined_Tokens);
SELECT AlbumId FROM Albums WHERE SEARCH(Combined_Tokens, @p);
La concatenazione TOKENLIST
può essere implementata anche interamente lato query.
Per ulteriori informazioni, consulta la sezione Concatenazione TOKENLIST
lato query.
TOKENLIST_CONCAT
è supportata sia per testo completo
di sottostringhe.
Spanner non ti consente di mescolare tipi di tokenizzazione, ad esempio TOKENIZE_FULLTEXT
e TOKENIZE_SUBSTRING
nella stessa chiamata TOKENLIST_CONCAT
.
La definizione delle colonne di testo TOKENLIST
può essere modificata nelle colonne non memorizzate per aggiungere altre colonne. Questa operazione è utile quando vuoi aggiungere un'altra colonna a TOKENLIST_CONCAT
. La modifica dell'espressione di colonna generata non
eseguire il backfill delle righe esistenti nell'indice.
Concatena le stringhe e tokenizza il risultato
L'esempio seguente concatena le stringhe e tokenizza il risultato:
CREATE TABLE Albums (
AlbumId STRING(MAX) NOT NULL,
Title STRING(MAX),
Studio STRING(MAX),
Combined_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(Title || " " || Studio)) HIDDEN,
) PRIMARY KEY(AlbumId);
CREATE SEARCH INDEX AlbumsIndex ON Albums(Combined_Tokens);
SELECT AlbumId FROM Albums WHERE SEARCH(Combined_Tokens, @p);
Concatenazione TOKENLIST
lato query
Il compromesso con l'indicizzazione del TOKENLIST
concatenato è che aumenta il costo di archiviazione e scrittura. Ora ogni token viene archiviato sul disco due volte:
una volta in un elenco di post del TOKENLIST
originale e una volta in un elenco di post
del TOKENLIST
combinato. La concatenazione lato query delle colonne TOKENLIST
consente di evitare questo costo, ma la query utilizza più risorse di calcolo.
Per concatenare più TOKENLIST
, utilizza il metodo
TOKENLIST_CONCAT
nel
SEARCH
query. Per questa sezione viene utilizzato il seguente schema di esempio:
CREATE TABLE Albums (
AlbumId STRING(MAX) NOT NULL,
Title STRING(MAX),
Studio STRING(MAX),
Title_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(Title)) HIDDEN,
Studio_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(Studio)) HIDDEN,
) PRIMARY KEY(AlbumId);
CREATE SEARCH INDEX AlbumsIndex ON Albums(Title_Tokens, Studio_Tokens);
La seguente query cerca le righe che hanno i token "blu"
e "nota" in qualsiasi punto nelle colonne Title
e Studio
. Sono incluse
le righe con "blu" e "nota" nella colonna Title
, "blu" e "nota" nella colonna
Studio
, "blu" nella colonna Title
e "nota" nella colonna Studio
o viceversa.
SELECT AlbumId
FROM Albums
WHERE SEARCH(TOKENLIST_CONCAT([AlbumTitle_Tokens, Studio_Tokens]), 'blue note')
La concatenazione TOKENLIST
lato scrittura e lato query produce risultati identici.
La scelta tra le due opzioni è un compromesso tra il costo del disco e il costo delle query.
In alternativa, un'applicazione può cercare in più colonne TOKENLIST
e utilizzare
OR
insieme alla funzione SEARCH
:
SEARCH(AlbumTitle_Tokens, 'Blue Note') OR SEARCH(Studio_Tokens, 'Blue Note')
Tuttavia, la semantica è diversa. Non corrisponde agli album in cui
AlbumTitle_Tokens
ha "blu", ma non "nota" e Studio_Tokens
ha
"nota", ma non "blu".
Passaggi successivi
- Scopri di più sulle query di ricerca full-text.
- Scopri di più sugli indici di ricerca.