Tous les produits
Search
Centre de documentation

Tair (Redis® OSS-Compatible):Accélérer les requêtes multicolumnes à l'aide de TairSearch

Dernière mise à jour :Aug 08, 2026

TairSearch est un système de recherche en temps réel, entièrement en mémoire, qui intègre la mise en cache et le calcul. Son mécanisme central d'index inversé prend non seulement en charge les requêtes de correspondance floue sur les racines des mots, mais permet également à TairSearch de servir de magasin pour les données fréquemment accédées. Cette intégration calcul-stockage accélère les requêtes multicolumnes, quel que soit le nombre de colonnes impliquées.

Contexte

De nombreuses applications stockent leurs données clés dans une base de données relationnelle telle que MySQL. Pour réduire la charge de la base de données et améliorer les performances, les développeurs ajoutent souvent un système de cache clé-valeur comme Redis afin de gérer les requêtes portant sur les données fréquemment accédées. Toutefois, lorsqu'un cas d'utilisation nécessite des requêtes multicolumnes ou des requêtes de correspondance floue LIKE dans la base de données, un système de cache clé-valeur standard ne suffit pas. Il faut alors recourir à des mécanismes de filtrage et de mise en correspondance supplémentaires, tels que des scripts Lua ou un calcul externe, pour effectuer des requêtes multicolumnes.

Limites des systèmes de cache clé-valeur dans les scénarios de requêtes multicolumnes

Lorsque vous importez des données depuis une base de données relationnelle vers un système de cache clé-valeur comme Redis, vous stockez généralement chaque ligne dans un hachage Redis. La clé primaire de la ligne devient la clé de hachage Redis, tandis que les autres noms de colonnes et leurs valeurs deviennent les champs et les valeurs du hachage.

La commande Redis HMGET permet de récupérer directement les champs spécifiés par clé primaire. Cependant, une base de données relationnelle comporte non seulement une clé primaire, mais aussi plusieurs index secondaires et divers index multicolumnes pour améliorer l'efficacité des requêtes. Redis présente des limites significatives dans les scénarios suivants :

  • Requête d'index secondaire : Redis ne permet pas d'interroger un hachage selon les valeurs de ses champs. Vous devez donc créer un index distinct dans Redis pour mapper les valeurs de l'index secondaire aux clés primaires. Cette solution accroît la complexité de l'importation des données et gaspille de la mémoire en raison de la redondance des données.

  • Requête multicolumnes : Redis ne prend pas en charge les requêtes sur un hachage basées sur plusieurs valeurs de champ. Vous devez implémenter ce type de requêtes vous-même, par exemple avec des scripts Lua ou la logique d'une application externe.

Cette rubrique s'appuie sur l'exemple d'un service de recherche de billets d'avion pendant une pointe de trafic pour montrer comment TairSearch accélère les requêtes multicolumnes.

Remarque

Pour plus d'informations sur TairSearch et des exemples de commandes, consultez Recherche.

Recherche précise de vols

Les recherches de vols vers des destinations touristiques populaires peuvent provoquer des pointes de trafic lors des longues vacances, telles que les vacances d'été, la fête nationale et le festival du Printemps. Pour gérer ces pics, stockez toutes les informations sur les vols à venir dans TairSearch.

Étape 1 : Créer un index de document

Sur une plateforme de réservation de vols classique, une recherche précise de vol implique plusieurs critères clés : le départ, la destination, la date de voyage, la classe de siège et la présence d'enfants ou de bébés.

Dans cet exemple, le nom de l'index TairSearch (departure_destination) est une concaténation des lieux de départ et de destination, par exemple zhuhai_hangzhou. Les champs d'index suivants sont créés : départ (departure), destination (destination), date (date), siège (seat), indication de voyage avec enfants ou bébés (with), ID de vol (flight_id), prix (price), heure de départ (departure_time) et heure d'arrivée (destination_time).

Remarque

Pour ajouter ou modifier des champs, exécutez la commande TFT.UPDATEINDEX.

Exemple de commande :

TFT.CREATEINDEX zhuhai_hangzhou '{
    "mappings":{
        "properties":{
            "departure":{"type":"keyword"},
            "destination":{"type":"keyword"},
            "date":{"type":"keyword"},
            "seat":{"type":"keyword"},
            "with":{"type":"keyword"},
            "flight_id":{"type":"keyword"},
            "price":{"type":"double"},
            "departure_time":{"type":"long"},
            "destination_time":{"type":"long"}
        }
    }
}'

Résultat attendu :

OK

Étape 2 : Écrire les données

Écrivez les informations de vol en tant que document dans l'index TairSearch. Voici un exemple de commande :

TFT.ADDDOC zhuhai_hangzhou '{
    "departure":"zhuhai",
    "destination":"hangzhou",
    "date":"2022-09-01",
    "seat":"first",
    "with":"baby",
    "flight_id":"CZ1000",
    "price":986.1,
    "departure_time":1661991010,
    "destination_time":1661998210
}'

Résultat attendu :

"{"_id":"16615908912020060"}"
# Returns the ID of the new document.

Étape 3 : Recherche précise

Pour rechercher des vols en première classe de Zhuhai à Hangzhou le 1er septembre 2022, triés par heure de départ, exécutez la commande suivante :

TFT.Search zhuhai_hangzhou '{"sort":["departure_time"],"query":{"bool":{"must":[{"term":{"date":"2022-09-01"}},{"term":{"seat":"first"}}]}}}'

Résultat attendu :

"{
    "hits": {
        "hits": [
            {
                "_id": "16615908912020060",
                "_index": "zhuhai_hangzhou",
                "_score": 0.433955,
                "_source": {
                    "departure": "zhuhai",
                    "destination": "hangzhou",
                    "date": "2022-09-01",
                    "seat": "first",
                    "with": "baby",
                    "flight_id": "CZ1000",
                    "price": 986.1,
                    "departure_time": 1661991010,
                    "destination_time": 1661998210
                }
            }
        ],
        "max_score": 0.433955,
        "total": {
            "relation": "eq",
            "value": 1
        }
    }
}"