Index de recherche numérique

En plus d'indexer le texte, l'index de recherche permet d'indexer efficacement les nombres. Il est principalement utilisé pour enrichir les requêtes de recherche en texte intégral avec des conditions sur des champs numériques. Cette page décrit l'indexation des nombres pour les requêtes d'égalité et d'inégalité, ainsi que l'indexation d'un tableau de nombres.

Tokeniser des nombres

Vous utilisez la fonction TOKENIZE_NUMBER pour créer un indice numérique. Pour en savoir plus, consultez TOKENIZE_NUMBER.

Numéros d'index pour les requêtes d'égalité et d'inégalité

Spanner accepte l'indexation des nombres pour l'égalité et l'inégalité. Les recherches d'égalité correspondent à un nombre. Les recherches de plage et d'inégalité correspondent à un nombre compris dans une plage spécifique. Vous définissez cette valeur dans le paramètre comparison_type TOKENIZE_NUMBER:

  • Égalité: comparison_type=>"equality"
  • Inégalité et égalité: comparison_type=>"all"

Dans les deux cas, le nombre d'origine (entier ou à virgule flottante) subit un processus de tokenisation, qui est conceptuellement semblable à la tokenisation du texte complet. Il génère un ensemble de jetons que la requête peut ensuite utiliser pour rechercher les documents correspondant à la condition numérique.

L'indexation par égalité ne produit qu'un seul jeton, qui représente le nombre. Ce mode est recommandé si les requêtes ne comportent que des conditions sous la forme de field = @p dans la clause WHERE.

L'indexation des inégalités et des égalités peut accélérer un plus grand nombre de conditions dans la clause WHERE de la requête. Cela inclut field < @p, field <= @p, field > @p, field >= @p, field BETWEEN @p1 and @p2 et field <> @p, ainsi que les conditions d'égalité. Pour implémenter ce type d'indexation, Spanner génère des jetons dans l'index de recherche sous-jacent. Spanner peut générer de nombreux jetons pour chaque numéro indexé, en fonction des paramètres de réglage. Le nombre de jetons dépend des paramètres définis pour TOKENIZE_NUMBER, tels que algorithm, min, max et granularity. Il est donc important d'évaluer attentivement les paramètres de réglage pour assurer un équilibre approprié entre le stockage sur disque et le temps de recherche.

Tokenisation de tableau

En plus des valeurs scalaires, TOKENIZE_NUMBER accepte la tokenisation d'un tableau de nombres.

Lorsque TOKENIZE_NUMBER est utilisé avec la colonne ARRAY, vous devez spécifier comparison_type=>"equality". Les requêtes de plage ne sont pas acceptées avec un tableau de nombres.

Prenons l'exemple du schéma suivant:

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);

La requête suivante recherche tous les albums ayant une note de 1 ou 2:

SELECT AlbumId
FROM Albums
WHERE ARRAY_INCLUDES_ANY(Ratings, [1, 2])

La requête suivante recherche tous les albums ayant reçu une note de 1 et de 5:

SELECT AlbumId
FROM Albums
WHERE ARRAY_INCLUDES_ALL(Ratings, [1, 5])

Étape suivante