Oltre all'indicizzazione del testo, l'indice della Ricerca fornisce un modo efficiente per indicizzare i numeri. Viene utilizzato principalmente per migliorare le query di ricerca a testo intero con condizioni sui campi numerici. Questa pagina descrive l'indicizzazione dei numeri per le query di uguaglianza e disuguaglianza e l'indicizzazione di un array di numeri.
Tokenizza i numeri
I tokenizzatori di numeri vengono utilizzati per generare un insieme di token che vengono utilizzati per accelerare le ricerche di confronto numerico.
Utilizza la funzione TOKENIZE_NUMBER per creare un indice numerico. TOKENIZE_NUMBER supporta INT64,
FLOAT32, FLOAT64 o ARRAY di questi tipi.
Per PostgreSQL, utilizza la funzione spanner.tokenize_number per creare un indice numerico. spanner.tokenize_number supporta solo il tipo bigint.
Indicizza i numeri per le query di uguaglianza e disuguaglianza
Spanner supporta l'indicizzazione dei numeri per uguaglianza e disuguaglianza.
Le ricerche di uguaglianza corrispondono a un numero. Le ricerche di intervalli e disuguaglianze corrispondono a un numero
all'interno di un intervallo specifico. Imposta questo valore nel parametro TOKENIZE_NUMBER
comparison_type:
- Uguaglianza:
comparison_type=>"equality" - Disuguaglianza e uguaglianza:
comparison_type=>"all"
In entrambi i casi, il numero originale (intero o in virgola mobile) viene sottoposto a un processo di tokenizzazione, concettualmente simile alla tokenizzazione del testo completo. Genera un insieme di token che la query può utilizzare per individuare i documenti che corrispondono alla condizione numerica.
L'indicizzazione di uguaglianza produce un solo token, che rappresenta il numero. Questa modalità è consigliata se le query hanno condizioni solo sotto forma di field = @p nella clausola WHERE.
L'indicizzazione di disuguaglianza e uguaglianza può accelerare una gamma più ampia di condizioni nella clausola WHERE della query. Sono inclusi field < @p, field <= @p,
field > @p, field >= @p, field BETWEEN @p1 and @p2 e field <> @p, oltre
alle condizioni di uguaglianza. Per implementare questo tipo di indicizzazione, Spanner produce token nell'indice della Ricerca sottostante.
Spanner può produrre molti token per ogni numero indicizzato, a seconda dei parametri di ottimizzazione. Il numero di token dipende dai parametri impostati per TOKENIZE_NUMBER, ad esempio algorithm, min, max e granularity. È quindi importante valutare attentamente i parametri di ottimizzazione per garantire un equilibrio appropriato tra spazio di archiviazione su disco e tempo di ricerca.
Per le query su intervalli di tipi di numeri interi come INT64, la specifica di algorithm =>
"prefixtree" può migliorare in modo significativo le prestazioni rispetto all'algoritmo logtree predefinito. Questo algoritmo genera token in base ai prefissi dei numeri, consentendo un pruning più efficiente dello spazio di ricerca per le condizioni di intervallo (ad esempio, <= e >=). Per le query in cui la clausola WHERE contiene predicati di intervallo, l'algoritmo prefixtree genera meno token di indice per i numeri piccoli rispetto a logtree, il che può migliorare le prestazioni e i costi di archiviazione.
Tokenizzazione degli array
Oltre ai valori scalari, TOKENIZE_NUMBER supporta la tokenizzazione di un array di numeri (gli esempi in questa sezione sono per i database con dialetto GoogleSQL; PostgreSQL non supporta l'accelerazione degli array numerici con gli indici della Ricerca).
Quando TOKENIZE_NUMBER viene utilizzato con la colonna ARRAY, devi specificare comparison_type=>"equality". Le query di intervallo non sono supportate con un array di numeri.
CREATE TABLE Albums (
AlbumId STRING(MAX) NOT NULL,
Ratings ARRAY<INT64>,
Ratings_Tokens TOKENLIST
AS (TOKENIZE_NUMBER(Ratings, comparison_type=>"equality")) HIDDEN
) PRIMARY KEY(AlbumId);
CREATE SEARCH INDEX AlbumsIndex ON Albums(Ratings_Tokens);
```
The following query finds all albums that have a rating of 1 or 2:
```sql
SELECT AlbumId
FROM Albums
WHERE ARRAY_INCLUDES_ANY(Ratings, [1, 2])
```
The following query finds all albums that were rated as 1 and as 5:
```sql
SELECT AlbumId
FROM Albums
WHERE ARRAY_INCLUDES_ALL(Ratings, [1, 5])
```
### Options for indexing high-precision numbers not supported by `TOKENIZE_NUMBER`
If you need to perform search queries on numeric types not directly supported by
`TOKENIZE_NUMBER` (such as `NUMERIC` or `BIGNUMERIC`),
consider these options:
* **Schema Modification:** Change the column type to `INT64` for the subset of
data that fits within the `INT64` range. Handle values exceeding the `INT64`
range separately, potentially in a different table or using application
logic.
* **Conceptual Mapping to Supported Types:** Explore creating generated
columns to map the `NUMERIC` values to an `INT64` range. This would allow
`TOKENIZE_NUMBER` to be used on the generated column. Be sure to validate
the query results against the original `NUMERIC` column in case your mapping
does not perfectly preserve precision. The specifics of the mapping function
needed for this approach are highly dependent on your specific data.
## What's next
* Learn about [tokenization and Spanner
tokenizers](/spanner/docs/full-text-search/tokenization).
* Learn about [search indexes](/spanner/docs/full-text-search/search-indexes).
* Learn about [index
partitioning](/spanner/docs/full-text-search/partition-search-index).