Tous les produits
Search
Centre de documentation

Tablestore:Search index operations

Dernière mise à jour :Aug 18, 2026

Utilisez les fonctions de requête d'index de recherche dans les clauses WHERE SQL pour effectuer des recherches en texte intégral, ainsi que des requêtes sur des tableaux, des données imbriquées, des vecteurs et du JSON sur les tables de mappage d'index de recherche.

Opérations prises en charge

Remarque

Avant d'utiliser les requêtes SQL d'index de recherche, créez une table de mappage pour l'index de recherche. Pour plus d'informations, consultez la rubrique Opérations DDL.

Fonction

Type de requête

Description

TEXT_MATCH

Recherche en texte intégral

Sélectionne les lignes contenant au moins un jeton issu du texte de requête.

TEXT_MATCH_PHRASE

Recherche en texte intégral

Sélectionne les lignes dans lesquelles les jetons apparaissent consécutivement dans l'ordre spécifié.

ARRAY_EXTRACT

Requête sur tableau

Développe une colonne de type tableau pour permettre le filtrage avec des opérateurs.

NESTED_QUERY

Requête de type imbriqué

Exige qu'un seul élément JSON satisfasse toutes les conditions.

VECTOR_QUERY_FLOAT32

Recherche vectorielle

Effectue des requêtes de plus proches voisins approximatifs (ANN).

SCORE()

Recherche vectorielle

Renvoie le score de pertinence d'un résultat de recherche vectorielle.

->>

Fonction JSON

Extrait une valeur au chemin spécifié et la convertit en chaîne.

JSON_UNQUOTE

Fonction JSON

Supprime les guillemets extérieurs d'une valeur JSON.

JSON_EXTRACT

Fonction JSON

Extrait le sous-document au chemin spécifié.

Recherche en texte intégral

Faites correspondre les données des champs de type Text à l'aide de TEXT_MATCH pour une correspondance par jetons ou de TEXT_MATCH_PHRASE pour une correspondance par expression.

Remarque

Avant d'utiliser la recherche en texte intégral, configurez la colonne cible comme étant de type Text dans l'index de recherche et définissez une Tokenization. Pour les colonnes utilisant une tokenisation floue, utilisez TEXT_MATCH_PHRASE pour des requêtes floues performantes.

TEXT_MATCH (requête de correspondance)

Tokenise le texte de la requête et sélectionne les lignes contenant au moins un jeton. Renvoie une valeur booléenne : true en cas de correspondance, false sinon.

TEXT_MATCH(fieldName, text [, options])

Paramètre

Type

Description

fieldName

STRING

Nom de la colonne à faire correspondre. La colonne doit être de type Text dans l'index de recherche.

text

STRING

Texte de la requête. Le texte est tokenisé puis comparé aux données de la ligne. Une ligne correspond si elle contient n'importe quel jeton. Le tokenizer de l'index de recherche détermine la manière dont le texte est divisé en jetons. Si aucun tokenizer n'est spécifié, la tokenisation par caractère unique est utilisée par défaut.

options

STRING

Paramètres de correspondance facultatifs, incluant operator (l'opérateur logique, qui peut être OR ou AND, par défaut OR) et minimum_should_match (le nombre minimal de jetons correspondants, par défaut 1). Si l'opérateur est OR, une ligne correspond lorsqu'elle contient au moins minimum_should_match jetons. Si l'opérateur est AND, tous les jetons doivent être présents dans la ligne.

TEXT_MATCH_PHRASE (requête de correspondance d'expression)

Similaire à TEXT_MATCH, mais exige que les jetons apparaissent consécutivement dans le même ordre dans les données de la ligne. Renvoie une valeur booléenne.

TEXT_MATCH_PHRASE(fieldName, text)

Les paramètres sont identiques à ceux de TEXT_MATCH, mais TEXT_MATCH_PHRASE exige que les jetons correspondent consécutivement dans l'ordre. Par exemple, le texte de requête « this is » correspond à « this is tablestore », mais pas à « this table is » ni à « is this ».

Exemples

Interrogez les données de la colonne content contenant le jeton « tablestore » :

SELECT * FROM search_exampletable WHERE TEXT_MATCH(content, 'tablestore') LIMIT 10;

Interrogez les données de la colonne content contenant l'expression consécutive « sql query » :

SELECT * FROM search_exampletable WHERE TEXT_MATCH_PHRASE(content, 'sql query') LIMIT 10;

Utilisez le paramètre options pour faire correspondre les données contenant au moins 2 jetons :

SELECT * FROM search_exampletable WHERE TEXT_MATCH(content, 'tablestore is cool', 'or', '2') LIMIT 10;

Utilisez l'opérateur AND pour exiger la présence de tous les jetons :

SELECT * FROM search_exampletable WHERE TEXT_MATCH(content, 'tablestore is cool', 'and') LIMIT 10;

Requêtes sur tableau

Utilisez la fonction ARRAY_EXTRACT pour interroger les données dans les colonnes de type tableau. Configurez la colonne comme étant de type tableau dans l'index de recherche en activant l'option array dans la console ou en définissant IsArray sur true dans le SDK. Lors de l'écriture des données, les valeurs de tableau doivent être au format de tableau JSON, par exemple ["a","b","c"].

Mappage des types de données

Type de table de données

Type d'index de recherche

Type SQL

String

Type réel des éléments du tableau (Long, Double, Boolean, Keyword ou Text), avec la propriété array activée pour la colonne

VARCHAR (clé primaire) ou MEDIUMTEXT (colonne prédéfinie)

ARRAY_EXTRACT(col_name)

ARRAY_EXTRACT développe une colonne de type tableau et se combine avec des opérateurs en tant que condition de clause WHERE. Les opérateurs pris en charge incluent l'égalité (=), les plages (>, <) et LIKE.

Important

Vous ne pouvez pas utiliser directement une colonne de type tableau avec des opérateurs comme condition de requête. Utilisez la fonction ARRAY_EXTRACT.

Limitations

  • ARRAY_EXTRACT s'utilise uniquement sur les tables de mappage d'index de recherche, et un seul paramètre de colonne de tableau est autorisé par appel. La fonction s'utilise uniquement comme condition de clause WHERE. Elle ne peut pas servir d'expression SELECT ni pour l'agrégation et le tri.

  • Une colonne de type tableau sans ARRAY_EXTRACT peut servir de nom de colonne SELECT ou d'expression, mais ne peut pas être utilisée pour l'agrégation et le tri.

  • Lorsque ARRAY_EXTRACT est combiné avec des opérateurs comme condition de requête, la conversion de type de données n'est pas prise en charge. La valeur de requête doit correspondre au type de données de la colonne de tableau. Par exemple, une colonne de tableau de type Long prend en charge ARRAY_EXTRACT(col) = 1 mais ne prend pas en charge ARRAY_EXTRACT(col) = '1'.

  • Les éléments de tableau de type Text doivent être utilisés avec la fonction TEXT_MATCH ou TEXT_MATCH_PHRASE, par exemple TEXT_MATCH(ARRAY_EXTRACT(col_text), 'keyword').

Exemples

-- Query rows that contain the value 'apple' in the array
SELECT * FROM search_exampletable WHERE ARRAY_EXTRACT(col_array) = 'apple';

-- Query rows that contain elements starting with 'd' in the array
SELECT * FROM search_exampletable WHERE ARRAY_EXTRACT(col_array) LIKE 'd%';

Requêtes de type imbriqué

Les colonnes de type imbriqué stockent des tableaux JSON dans lesquels chaque élément contient plusieurs sous-colonnes. Le type de données de la colonne dans la table de données doit être String. Configurez la colonne comme étant de type Nested et spécifiez les types de données des sous-colonnes lors de la création de l'index de recherche.

Lors de la création d'une table de mappage, définissez les colonnes de type imbriqué comme MEDIUMTEXT. Les sous-colonnes internes sont créées automatiquement et peuvent être affichées avec DESCRIBE, par exemple col_nested.name et col_nested.age. Dans les requêtes, les noms de sous-colonnes utilisent le format nested_column.sub_column, avec des points (.) séparant les niveaux d'imbrication multiples, par exemple col1.col2.col3.

Mappage des types de données

Type de table de données

Type d'index de recherche

Type SQL

String

Type imbriqué. Les types de données des sous-colonnes correspondent aux types de données réels des données écrites.

VARCHAR (clé primaire) ou MEDIUMTEXT (colonne prédéfinie)

Méthodes de requête

Requête directe sur sous-colonne

Utilisez directement les sous-colonnes imbriquées avec des opérateurs. Une ligne correspond si n'importe quel élément JSON de la ligne possède une sous-colonne qui satisfait la condition.

SELECT * FROM search_exampletable WHERE `col_nested.age` > 30;

Fonction NESTED_QUERY

Exige qu'un seul élément JSON satisfasse toutes les conditions.

NESTED_QUERY(subcol_column_condition)

subcol_column_condition spécifie les conditions de requête sur les sous-colonnes au même niveau d'imbrication. Combinez plusieurs conditions avec AND ou OR.

Différence entre les deux méthodes

Supposons que la colonne imbriquée tags contienne les données de ligne suivantes : [{"tagName":"tag1", "score":0.8}, {"tagName":"tag2", "score":0.2}] :

  • tags.tagName — Correspondance, car le premier élément satisfait la condition tagName et le second élément satisfait la condition score.

  • NESTED_QUERY( — Pas de correspondance, car aucun élément unique ne satisfait les deux conditions.

Limitations

  • NESTED_QUERY s'utilise uniquement sur les tables de mappage d'index de recherche et uniquement comme clause WHERE. Elle ne peut pas servir d'expression SELECT ni pour l'agrégation, le regroupement ou le tri.

  • Les sous-colonnes imbriquées ne peuvent pas servir d'expressions SELECT ni pour l'agrégation, le regroupement ou le tri.

  • ALTER TABLE ne peut pas ajouter ou supprimer directement des sous-colonnes imbriquées. Vous pouvez uniquement ajouter ou supprimer la colonne imbriquée entière, et les sous-colonnes sont automatiquement ajoutées ou supprimées avec elle.

  • Les sous-colonnes imbriquées ne prennent pas en charge la conversion de type de données ni les calculs de fonctions qui ne peuvent pas être poussés vers l'index de recherche. Assurez-vous que les types de données des sous-colonnes imbriquées sont corrects.

Exemples

-- Direct subcolumn query: query rows where age > 30 in the nested column
SELECT * FROM search_exampletable WHERE `col_nested.age` > 30;

-- NESTED_QUERY: query rows where a single element has name starting with 'I' and age < 20
SELECT * FROM search_exampletable WHERE NESTED_QUERY(`col_nested.name` LIKE 'I%' AND `col_nested.age` < 20);

-- Multi-level nesting
SELECT * FROM search_exampletable WHERE NESTED_QUERY(`col1.col2` = 1 AND NESTED_QUERY(`col1.col3.col4` = 2));

Requêtes sur colonne virtuelle

Les colonnes virtuelles d'index de recherche vous permettent d'interroger de nouveaux champs et types en modifiant le schéma de l'index de recherche, sans changer la structure de stockage de la table de données. Les colonnes virtuelles sont définies dans la table de mappage avec leurs types de données SQL réels.

Mappage des types de données

Type de colonne virtuelle d'index de recherche

Type SQL

Description

Keyword

MEDIUMTEXT

Les colonnes virtuelles n'ont pas de colonne correspondante dans la table de données. Seules leurs colonnes source ont des colonnes correspondantes.

Text

MEDIUMTEXT

Long

BIGINT

Double

DOUBLE

Utilisation prise en charge

  • Filtrez les données dans les clauses WHERE. Le type de données de la colonne virtuelle dans la condition doit correspondre au type de paramètre de requête.

  • Utilisation dans l'agrégation et le regroupement. Le type de données source de la colonne virtuelle doit être compatible avec l'opération. Par exemple, seuls les types Long et Double prennent en charge SUM. Les colonnes virtuelles de type Keyword ne peuvent pas être sommées, et les colonnes virtuelles de type Text ne prennent pas en charge le regroupement.

  • Les requêtes TopN et le tri sont pris en charge. Le tri nécessite LIMIT.

Limitations

  • Les colonnes virtuelles s'utilisent uniquement dans les tables de mappage d'index de recherche.

  • Les colonnes virtuelles s'utilisent uniquement dans les conditions de requête. Elles ne peuvent pas être utilisées dans SELECT pour renvoyer des valeurs de colonne. Pour renvoyer des valeurs, spécifiez la colonne source de la colonne virtuelle. SELECT * n'est pas affecté et exclut automatiquement les colonnes virtuelles des résultats.

  • Les colonnes virtuelles ne peuvent pas être utilisées pour les comparaisons de colonnes, les calculs ou les JOINs.

  • Les colonnes virtuelles ne prennent pas en charge la conversion de type de données ni les calculs de fonctions qui ne peuvent pas être poussés vers l'index de recherche. Actuellement, seules les fonctions d'agrégation peuvent être poussées dans les requêtes SQL.

Exemples

Créez une table de mappage d'index de recherche incluant des colonnes virtuelles :

CREATE TABLE search_exampletable(
    col_keyword MEDIUMTEXT,
    col_keyword_virtual_long BIGINT
)
ENGINE='searchindex',
ENGINE_ATTRIBUTE='{"index_name":"exampletable_index","table_name":"exampletable"}';

Requête avec des colonnes virtuelles :

SELECT * FROM search_exampletable WHERE col_keyword_virtual_long > 100 LIMIT 10;

Recherche vectorielle

Utilisez la fonction VECTOR_QUERY_FLOAT32 pour les requêtes de plus proches voisins approximatifs (ANN). Les champs vectoriels sont stockés sous forme de chaînes dans la table de données. Configurez-les comme étant de type vector dans l'index de recherche, et spécifiez les dimensions, le type de données et la métrique de distance. Le type de données SQL des colonnes vectorielles dans la table de mappage est MEDIUMTEXT.

VECTOR_QUERY_FLOAT32

VECTOR_QUERY_FLOAT32(fieldName, float32QueryVector, topK, filter)

Paramètre

Obligatoire

Description

fieldName

Oui

Nom de la colonne vectorielle. La colonne doit être de type vector dans l'index de recherche.

float32QueryVector

Oui

Vecteur de requête. Les dimensions doivent correspondre à celles du champ vectoriel dans l'index de recherche.

topK

Oui

Nombre de résultats les plus proches à renvoyer. Une valeur K plus élevée améliore le rappel mais augmente la latence et le coût de la requête. Si topK est inférieur à la valeur LIMIT, le serveur augmente automatiquement topK pour correspondre à LIMIT. Pour la valeur topK maximale, consultez la rubrique Limites de l'index de recherche.

filter

Non

Filtre de requête qui prend en charge toute combinaison de conditions de requête non vectorielles. Les conditions de filtre sont appliquées avant la recherche vectorielle pour réduire l'ensemble de candidats afin d'obtenir des résultats plus précis. Vous pouvez également ajouter des conditions de filtre dans la clause WHERE avec AND, mais ces conditions filtrent les résultats topK après la recherche vectorielle.

Fonction SCORE()

Utilisez SCORE() avec VECTOR_QUERY_FLOAT32 comme expression SELECT pour renvoyer le score de pertinence de chaque résultat. Un score plus élevé indique une similarité plus grande.

SCORE()

Limitations

  • VECTOR_QUERY_FLOAT32 s'utilise uniquement sur les tables de mappage d'index de recherche et doit être utilisé avec LIMIT. Les clauses HAVING ne sont pas prises en charge.

  • VECTOR_QUERY_FLOAT32 s'utilise uniquement comme clause WHERE. Elle ne peut pas servir d'expression SELECT ni pour l'agrégation, le regroupement ou le tri.

  • SCORE() s'utilise uniquement avec VECTOR_QUERY_FLOAT32 et uniquement comme expression SELECT. Elle ne peut pas être utilisée dans les clauses WHERE, l'agrégation ou le tri.

  • Les autres conditions de la clause WHERE doivent prendre en charge le pushdown vers l'index de recherche. Sinon, la requête échoue. Pour les opérateurs de pushdown pris en charge, consultez la rubrique Optimisation des requêtes.

Exemples

Interrogez les 10 résultats les plus similaires au vecteur spécifié dans la colonne col_vector :

SELECT *, SCORE() FROM exampletable WHERE VECTOR_QUERY_FLOAT32(col_vector, '[1.5, -1.5, 2.5, -2.5]', 10) LIMIT 10;

Utilisez filter pour réduire l'ensemble de candidats avant la recherche vectorielle afin d'obtenir des résultats plus précis :

SELECT *, SCORE() FROM exampletable WHERE VECTOR_QUERY_FLOAT32(col_vector, '[1.5, -1.5, 2.5, -2.5]', 100, col_keyword='cat_a' AND year_num=2024) LIMIT 10;

Utilisez AND dans la clause WHERE pour le filtrage post-recherche vectorielle. Les résultats topK peuvent ne pas inclure toutes les lignes correspondantes :

SELECT *, SCORE() FROM exampletable WHERE col_keyword='cat_a' AND VECTOR_QUERY_FLOAT32(col_vector, '[1.5, -1.5, 2.5, -2.5]', 500) LIMIT 10;

Fonctions JSON

Les fonctions JSON SQL de Tablestore suivent la syntaxe MySQL 5.7 et extraient les données des colonnes au format JSON.

Fonction

Syntaxe

Description

->>

col->>'$.path'

Extrait la valeur au chemin spécifié et la convertit en chaîne. Équivalent à JSON_UNQUOTE(JSON_EXTRACT()).

JSON_UNQUOTE

JSON_UNQUOTE(json_val)

Supprime les guillemets extérieurs d'une valeur JSON et renvoie une chaîne.

JSON_EXTRACT

JSON_EXTRACT(json_doc, path[, path] ...)

Extrait le sous-document au chemin spécifié. La valeur de retour conserve le format JSON.

->> (extraction de chemin JSON)

Extrait la valeur au chemin spécifié d'une colonne JSON et la convertit en chaîne sans guillemets. Équivalent à JSON_UNQUOTE(JSON_EXTRACT()).

column->>'$.path'

Paramètre

Type

Description

column

STRING

Nom de la colonne.

path

STRING

Expression de chemin JSON qui doit commencer par $. Pour la syntaxe détaillée, consultez la section Syntaxe de chemin JSON ci-dessous.

Exemple

SELECT col_json->>'$.city' AS city FROM exampletable LIMIT 10;

JSON_UNQUOTE

Supprime les guillemets extérieurs d'une valeur JSON et renvoie une chaîne. Renvoie NULL si l'argument est NULL.

JSON_UNQUOTE(json_val)

Paramètre

Type

Description

json_val

STRING

Valeur JSON, généralement la valeur de retour de JSON_EXTRACT. Une erreur est renvoyée si la valeur commence et se termine par des guillemets doubles mais n'est pas un littéral de chaîne JSON valide.

Exemple

SELECT JSON_UNQUOTE(JSON_EXTRACT(col_json, '$.city')) AS city FROM exampletable LIMIT 10;

JSON_EXTRACT

Extrait le sous-document au chemin spécifié d'une colonne JSON. La valeur de retour conserve le format JSON, avec les valeurs de chaîne entourées de guillemets. Plusieurs chemins peuvent être spécifiés, et les résultats sont renvoyés au format tableau.

Important

Tablestore ne prend pas en charge les types JSON natifs. JSON_EXTRACT ne peut pas être utilisé seul et renvoie une erreur invalid column type: json. Utilisez JSON_EXTRACT avec JSON_UNQUOTE.

JSON_EXTRACT(json_doc, path[, path] ...)

Paramètre

Type

Description

json_doc

STRING

Document JSON. Une erreur est renvoyée si la valeur n'est pas un document JSON valide.

path

STRING

Expression de chemin JSON qui doit commencer par $. Plusieurs chemins sont pris en charge. Renvoie NULL si un argument est NULL ou si le chemin n'existe pas dans le document. Une erreur est renvoyée si le chemin n'est pas une expression de chemin valide.

Exemples

Extraire un chemin unique :

SELECT JSON_UNQUOTE(JSON_EXTRACT(col_json, '$.city')) AS city FROM exampletable WHERE pk = 1;

Extraire plusieurs chemins. Les résultats sont renvoyés au format tableau :

-- Assume col_json contains {"a": 1, "b": 2, "c": {"d": 4}}
SELECT JSON_UNQUOTE(JSON_EXTRACT(col_json, '$.a', '$.b', '$.c.d')) AS subdoc FROM exampletable WHERE pk = 1;
-- Result: [1, 2, 4]

Syntaxe de chemin JSON

Les chemins doivent commencer par $, qui représente l'intégralité du document JSON. Ajoutez des sélecteurs de chemin après $. Les sélecteurs peuvent être combinés.

Sélecteur

Exemple

Description

$.key

$.a, $.c.d

Accède à un membre d'objet. Entourez les clés contenant des espaces de guillemets doubles, par exemple $."a fish".

[N]

$[0], $.f[1]

Accède à un élément de tableau. Les index commencent à 0.

.*

$.*

Joker d'objet. Renvoie les valeurs de tous les membres.

[*]

$.arr[*]

Joker de tableau. Renvoie les valeurs de tous les éléments.

prefix**suffix

$**.d

Joker de chemin. Correspond à tous les chemins qui commencent par prefix et se terminent par suffix.

Exemples de requête d'objet JSON

Supposons que la colonne JSON contienne {"a": 1, "f": [1, 2, 3], "c": {"d": 4}} :

Chemin

Valeur de retour

Description

$

{"a": 1, "c": {"d": 4}, "f": [1, 2, 3]}

L'intégralité du document

$.a

1

Un membre direct

$.c

{"d": 4}

Un objet imbriqué

$.c.d

4

Un membre d'objet imbriqué

$.f[1]

2

Un élément de tableau

Exemples de requête de tableau JSON

Supposons que la colonne JSON contienne [3, {"a": [5, 6], "b": 10}, [99, 100]]. Les valeurs de retour non scalaires prennent en charge les requêtes imbriquées.

Chemin

Valeur de retour

Description

$[0]

3

Un élément scalaire

$[1]

{"a": [5, 6], "b": 10}

Une valeur non scalaire. Les requêtes imbriquées peuvent continuer.

$[1].a

[5, 6]

Un membre d'objet imbriqué

$[1].a[1]

6

Un élément de tableau imbriqué

$[1].b

10

Un membre d'objet imbriqué

$[2][0]

99

Un élément de tableau imbriqué

$[3]

NULL

Hors limites. Renvoie NULL.