Tous les produits
Search
Centre de documentation

Tablestore:Filtres

Dernière mise à jour :Aug 18, 2026

Les filtres permettent de filtrer les résultats de lecture côté serveur en ne renvoyant que les lignes correspondant aux critères définis. Cette approche réduit le volume de données transférées sur le réseau et diminue les temps de réponse.

Cas d'utilisation

  • Filtrage direct des résultats

    Prenons l'exemple d'un compteur intelligent dans un scénario d'Internet des objets (IoT). Le compteur écrit des données telles que la tension, l'intensité et la consommation dans Tablestore à une fréquence fixe, par exemple toutes les 15 secondes. Pour l'analyse quotidienne, vous devez identifier si un compteur a connu des anomalies de tension et récupérer les autres données d'état associées à ces moments afin de décider si une inspection de la ligne électrique est nécessaire.

    Sans filtre, vous utiliseriez l'opération GetRange pour lire l'ensemble des 5 760 enregistrements de surveillance d'un seul compteur pour une journée. Vous devriez ensuite traiter ces 5 760 enregistrements côté client pour trouver les 10 enregistrements indiquant une instabilité de la tension.

    Avec un filtre, le serveur ne renvoie que les 10 enregistrements requis. Cette méthode réduit considérablement le transfert de données et élimine le besoin de filtrage côté client, ce qui permet de réduire les coûts de développement.

  • Filtrage avec expressions régulières et conversion de type

    Si une colonne stocke des données dans un format personnalisé, comme une chaîne au format JSON, vous pouvez appliquer un filtre sur un sous-champ de cette chaîne. Pour ce faire, utilisez une expression régulière pour extraire la valeur du sous-champ, convertissez-la dans le type de données souhaité, puis appliquez le filtre.

    Par exemple, une colonne stocke des données au format {cluster_name:name1,lastupdatetime:12345}. Pour interroger les lignes où lastupdatetime>12345, vous pouvez utiliser l'expression régulière lastupdatetime:([0-9]+)} afin d'extraire la valeur du sous-champ. Vous pouvez ensuite convertir la valeur extraite en type numérique et effectuer une comparaison pour trouver les lignes souhaitées.

Vue d'ensemble

Vous pouvez utiliser un filtre avec les opérations GetRow, BatchGetRow ou GetRange pour ne renvoyer que les lignes répondant aux conditions spécifiées. Un filtre ne modifie ni la sémantique native ni les limites de ces opérations. Pour plus d'informations, consultez la rubrique Lecture des données.

Les filtres offrent les options de configuration suivantes :

  • Utilisez le paramètre PassIfMissing pour spécifier le comportement du filtre lorsqu'une colonne référencée n'existe pas dans une ligne.

  • Si une colonne référencée possède plusieurs versions, vous pouvez configurer le filtre pour qu'il compare uniquement la valeur de la dernière version.

  • Utilisez une expression régulière pour faire correspondre les valeurs des sous-champs.

  • Construisez des conditions de filtre composites en utilisant des opérateurs relationnels et logiques.

Tablestore propose les filtres SingleColumnValueFilter, SingleColumnValueRegexFilter et CompositeColumnValueFilter. Ces filtres déterminent s'il faut renvoyer une ligne en fonction des valeurs d'une ou de plusieurs colonnes de référence.

Filtre

Description

SingleColumnValueFilter

Filtre les lignes en fonction de la valeur d'une seule colonne de référence.

SingleColumnValueRegexFilter

Permet d'utiliser une expression régulière pour faire correspondre des sous-chaînes dans une colonne de type chaîne. Vous pouvez ensuite convertir la sous-chaîne correspondante en chaîne, entier ou double, et filtrer en fonction de la valeur convertie.

L'expression régulière doit respecter les conditions suivantes :

  • La longueur ne peut pas dépasser 256 octets.

  • La syntaxe des expressions régulières Perl est prise en charge.

  • Seules les expressions régulières mono-octet sont prises en charge.

  • La mise en correspondance par expression régulière pour les caractères chinois n'est pas prise en charge.

  • Les modes de correspondance complète et partielle sont tous deux pris en charge.

    En mode de correspondance partielle, la sous-chaîne à extraire est entourée de parenthèses (...).

    Si le mode de correspondance complète est utilisé, la première correspondance est renvoyée. Si l'expression régulière contient une syntaxe de correspondance partielle, la première sous-chaîne capturée correspondante est renvoyée. Par exemple, si la valeur de la colonne est 1aaa51bbb5 et que l'expression régulière est 1[a-z]+5, la valeur renvoyée est 1aaa5. Si l'expression régulière est 1([a-z]+)5, la valeur renvoyée est aaa.

    Important

    Le filtre SingleColumnValueRegexFilter est pris en charge uniquement par le SDK Tablestore pour Java et n'autorise qu'un seul groupe de capture.

CompositeColumnValueFilter

Filtre les lignes en combinant logiquement des conditions portant sur plusieurs colonnes.

Remarques d'utilisation

  • Les conditions de filtre prennent en charge les opérateurs relationnels (=, !=, >, >=, <, <=) et les opérateurs logiques (NOT, AND, OR). Vous pouvez combiner jusqu'à 10 conditions.

  • Les colonnes référencées par un filtre doivent être incluses dans la demande de lecture. Sinon, le filtre ne pourra pas accéder à leurs valeurs.

  • Lorsque vous utilisez l'opération GetRange, une analyse unique ne peut pas dépasser 5 000 lignes ou 4 Mo de données.

    Si aucune ligne parmi les 5 000 lignes ou les 4 Mo de données analysés ne correspond aux conditions du filtre, le champ Rows de la réponse est vide, mais NextStartPrimaryKey peut ne pas l'être. Dans ce cas, vous devez poursuivre la lecture en utilisant la valeur NextStartPrimaryKey renvoyée jusqu'à ce qu'elle soit vide.

Utilisation

Important

Vous ne pouvez utiliser les filtres que via les SDK.

Vous pouvez utiliser des filtres avec le SDK Tablestore pour Java, le SDK Tablestore pour Go, le SDK Tablestore pour Python, le SDK Tablestore pour Node.js, le SDK Tablestore pour .NET et le SDK Tablestore pour PHP. Les exemples suivants utilisent le SDK Tablestore pour Java.

SingleColumnValueFilter

L'exemple de code suivant montre comment lire les données de la dernière version d'une ligne dans une table de données et utiliser un filtre pour filtrer les données en fonction de la valeur de la colonne Col0.

private static void getRow(SyncClient client, String pkValue) {
    // Construct the primary key. 
    PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(pkValue));
    PrimaryKey primaryKey = primaryKeyBuilder.build();

    // Specify the table name and primary key to read a row of data. 
    SingleRowQueryCriteria criteria = new SingleRowQueryCriteria("<TABLE_NAME>", primaryKey);
    // Set the MaxVersions parameter to 1 to read the latest version of data. 
    criteria.setMaxVersions(1);

    // Configure a filter to return a row in which the value of the Col0 column is 0. 
    SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter("Col0",
            SingleColumnValueFilter.CompareOperator.EQUAL, ColumnValue.fromLong(0));
    // If the Col0 column does not exist, the row is not returned. 
    singleColumnValueFilter.setPassIfMissing(false);
    criteria.setFilter(singleColumnValueFilter);

    GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria));
    Row row = getRowResponse.getRow();

    System.out.println("Read complete. Result:");
    System.out.println(row);
}

SingleColumnValueRegexFilter

L'exemple de code suivant montre comment lire les données dont les valeurs de clé primaire se situent dans la plage ["pk:2020-01-01.log", "pk:2021-01-01.log") de la colonne Col1 et utiliser une expression régulière pour filtrer les données de la colonne Col1.

private static void getRange(SyncClient client) {
    // Specify the name of the data table. 
    RangeRowQueryCriteria criteria = new RangeRowQueryCriteria("<TABLE_NAME>");
 
    // Specify ["pk:2020-01-01.log", "pk:2021-01-01.log") as the range of the primary key of the data that you want to read. The range is a left-closed, right-open interval. 
    PrimaryKey pk0 = PrimaryKeyBuilder.createPrimaryKeyBuilder()
        .addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("2020-01-01.log"))
        .build();
    PrimaryKey pk1 = PrimaryKeyBuilder.createPrimaryKeyBuilder()
        .addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("2021-01-01.log"))
        .build();
    criteria.setInclusiveStartPrimaryKey(pk0);
    criteria.setExclusiveEndPrimaryKey(pk1);
 
    // Set the MaxVersions parameter to 1 to read the latest version of data. 
    criteria.setMaxVersions(1);
 
    // Configure a filter. A row is returned when cast<int>(regex(Col1)) is greater than 100. 
    RegexRule regexRule = new RegexRule("t1:([0-9]+),", RegexRule.CastType.VT_INTEGER);
    SingleColumnValueRegexFilter filter =  new SingleColumnValueRegexFilter("Col1",
        regexRule,SingleColumnValueRegexFilter.CompareOperator.GREATER_THAN,ColumnValue.fromLong(100));
    criteria.setFilter(filter);

    while (true) {
        GetRangeResponse resp = client.getRange(new GetRangeRequest(criteria));
        for (Row row : resp.getRows()) {
            // do something
            System.out.println(row);
        }
        if (resp.getNextStartPrimaryKey() != null) {
            criteria.setInclusiveStartPrimaryKey(resp.getNextStartPrimaryKey());
        } else {
            break;
        }
   }
}

CompositeColumnValueFilter

L'exemple suivant montre comment renvoyer les lignes dont la clé primaire se situe dans la plage ["a","h") et qui satisfont à la condition suivante : (Col0 == 0 AND Col1 > 100) OR (Col2 <= 10).

private static void getRange(SyncClient client) {
    // Specify the table name.
    RangeRowQueryCriteria criteria = new RangeRowQueryCriteria("<TABLE_NAME>");

    // Set the primary key range to a left-closed, right-open interval.
    PrimaryKey pk0 = PrimaryKeyBuilder.createPrimaryKeyBuilder()
            .addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("a"))
            .build();
    PrimaryKey pk1 = PrimaryKeyBuilder.createPrimaryKeyBuilder()
            .addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("h"))
            .build();
    criteria.setInclusiveStartPrimaryKey(pk0);
    criteria.setExclusiveEndPrimaryKey(pk1);

    // Set the query to read only the latest version.
    criteria.setMaxVersions(1);

    // The condition for composite1 is (Col0 == 0) AND (Col1 > 100).
    CompositeColumnValueFilter composite1 = new CompositeColumnValueFilter(CompositeColumnValueFilter.LogicOperator.AND);
    SingleColumnValueFilter single1 = new SingleColumnValueFilter("Col0",
            SingleColumnValueFilter.CompareOperator.EQUAL, ColumnValue.fromLong(0));
    SingleColumnValueFilter single2 = new SingleColumnValueFilter("Col1",
            SingleColumnValueFilter.CompareOperator.GREATER_THAN, ColumnValue.fromLong(100));
    composite1.addFilter(single1);
    composite1.addFilter(single2);

    // The condition for composite2 is ( (Col0 == 0) AND (Col1 > 100) ) OR (Col2 <= 10).
    CompositeColumnValueFilter composite2 = new CompositeColumnValueFilter(CompositeColumnValueFilter.LogicOperator.OR);
    SingleColumnValueFilter single3 = new SingleColumnValueFilter("Col2",
            SingleColumnValueFilter.CompareOperator.LESS_EQUAL, ColumnValue.fromLong(10));
    composite2.addFilter(composite1);
    composite2.addFilter(single3);
    criteria.setFilter(composite2);

    while (true) {
        GetRangeResponse resp = client.getRange(new GetRangeRequest(criteria));
        for (Row row : resp.getRows()) {
            // do something
            System.out.println(row);
        }
        if (resp.getNextStartPrimaryKey() != null) {
            criteria.setInclusiveStartPrimaryKey(resp.getNextStartPrimaryKey());
        } else {
            break;
        }
    }
}

Facturation

Les filtres ne modifient pas les règles de facturation existantes.

Les filtres réduisent la quantité de données renvoyées, mais pas le nombre d'unités de capacité de lecture (CU) consommées. En effet, le filtrage s'effectue côté serveur après la lecture des données depuis le disque, de sorte que le nombre d'opérations d'E/S disque reste inchangé. Par exemple, si une opération GetRange lit 100 lignes totalisant 200 Ko et consomme 50 CU de lecture, l'application d'un filtre qui ne renvoie que 10 lignes (20 Ko) consommera toujours 50 CU de lecture.

FAQ

Choix entre un index secondaire et un index de recherche

Références

  • Si votre application doit interroger des données en fonction de différents attributs, vous pouvez définir ces attributs comme colonnes de clé primaire d'un index secondaire pour permettre des recherches rapides. Pour plus d'informations, consultez la rubrique Index secondaire.

  • Pour les scénarios métier nécessitant des requêtes multidimensionnelles (telles que des requêtes sur des colonnes autres que la clé primaire, des requêtes composites ou des recherches floues) ou une analyse de données (comme le calcul d'agrégats, le comptage de lignes ou le regroupement de données), vous pouvez utiliser un index de recherche. Définissez les attributs requis comme champs d'index de recherche pour interroger et analyser vos données. Pour plus d'informations, consultez la rubrique Index de recherche.