Zusätzlich zur Indexierung von Text bietet der Suchindex eine effiziente Möglichkeit, Zahlen zu indexieren. Sie wird hauptsächlich verwendet, um Volltextsuchabfragen um Bedingungen für numerische Felder zu erweitern. Auf dieser Seite wird beschrieben, wie Sie Zahlen für Gleichheits- und Ungleichheitsabfragen indexieren und ein Array von Zahlen indexieren.
Zahlen tokenisieren
Zahlentokenizer werden verwendet, um eine Reihe von Tokens zu generieren, die zur Beschleunigung von numerischen Vergleichssuchen verwendet werden.
Verwenden Sie die Funktion TOKENIZE_NUMBER, um einen numerischen Index zu erstellen. TOKENIZE_NUMBER unterstützt INT64, FLOAT32, FLOAT64 oder ARRAY dieser Typen.
Verwenden Sie für PostgreSQL die Funktion spanner.tokenize_number, um einen numerischen Index zu erstellen. spanner.tokenize_number unterstützt nur den Typ bigint.
Indexnummern für Gleichheits- und Ungleichheitsabfragen
Spanner unterstützt die Indexierung von Zahlen für Gleichheit und Ungleichheit.
Bei Gleichheitssuchen wird nach einer Zahl gesucht. Bei Bereichs- und Ungleichheitssuchen wird nach einer Zahl innerhalb eines bestimmten Bereichs gesucht. Sie legen diesen Wert im Parameter TOKENIZE_NUMBER
comparison_type fest:
- Gleichheit:
comparison_type=>"equality" - Ungleichheit und Gleichheit:
comparison_type=>"all"
In beiden Fällen wird die ursprüngliche Zahl (entweder Ganzzahl oder Gleitkommazahl) einem Tokenisierungsprozess unterzogen, der konzeptionell der Volltexttokenisierung ähnelt. Es wird ein Satz von Tokens erzeugt, die die Abfrage dann verwenden kann, um Dokumente zu finden, die der Zahlenbedingung entsprechen.
Bei der Gleichheitsindexierung wird nur ein Token erzeugt, das die Zahl darstellt. Dieser Modus wird empfohlen, wenn Abfragen nur Bedingungen in Form von field = @p in der WHERE-Klausel enthalten.
Die Indexierung von Ungleichheiten und Gleichheiten kann eine größere Bandbreite an Bedingungen in der WHERE-Klausel der Abfrage beschleunigen. Dazu gehören neben Gleichheitsbedingungen auch field < @p, field <= @p, field > @p, field >= @p, field BETWEEN @p1 and @p2 und field <> @p. Um diese Art der Indexierung zu implementieren, erzeugt Spanner Tokens im zugrunde liegenden Suchindex.
Spanner kann je nach Abstimmungsparametern viele Tokens für jede indexierte Zahl erzeugen. Die Anzahl der Tokens hängt von den Parametern ab, die für TOKENIZE_NUMBER festgelegt sind, z. B. algorithm, min, max und granularity. Daher ist es wichtig, die Abstimmungsparameter sorgfältig zu bewerten, um ein angemessenes Gleichgewicht zwischen Speicherplatz und Suchzeit zu erreichen.
Bei Bereichsabfragen für Ganzzahltypen wie INT64 kann die Angabe von algorithm =>
"prefixtree" die Leistung im Vergleich zum Standardalgorithmus logtree erheblich verbessern. Dieser Algorithmus generiert Tokens basierend auf Zahlenpräfixen, was eine effizientere Bereinigung des Suchbereichs für Bereichsbedingungen (z. B. <= und >=) ermöglicht. Bei Abfragen, bei denen die WHERE-Klausel Bereichsprädikate enthält, generiert der prefixtree-Algorithmus im Vergleich zu logtree weniger Index-Tokens für kleine Zahlen, was die Leistung und die Speicherkosten verbessern kann.
Array-Tokenisierung
Zusätzlich zu skalaren Werten unterstützt TOKENIZE_NUMBER die Tokenisierung eines Arrays von Zahlen. Die Beispiele in diesem Abschnitt beziehen sich auf Datenbanken im GoogleSQL-Dialekt. PostgreSQL unterstützt die Beschleunigung numerischer Arrays mit Suchindexen nicht.
Wenn TOKENIZE_NUMBER mit der Spalte ARRAY verwendet wird, müssen Sie comparison_type=>"equality" angeben. Bereichsabfragen werden mit einem Array von Zahlen nicht unterstützt.
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).