Mise à jour RediSearch : agrégation et nouvelles fonctionnalités

Mise à jour RediSearch : agrégation et nouvelles fonctionnalités

L’une des principales annonces de RedisConf était le moteur d’agrégation pour RediRecherche (version 1.1.0). Les agrégations sont une fonctionnalité incroyablement puissante pour un moteur de recherche en temps réel comme RediSearch. Ils permettent non seulement d’interroger les données, mais aussi de les résumer mathématiquement pour obtenir un aperçu analytique. Les agrégations RediSearch sont fournies avec la boîte à outils standard de réducteurs :

  • Comptes
  • Sommes
  • Le minimum
  • Maximum
  • Écart-type
  • quantile

Conceptuellement, les agrégations sont composées d’un pipeline d’opérations. Chaque opération peut être utilisée dans n’importe quel ordre logique et peut être répétée. Les opérations de base sont :

  • Grouper & Réduire
  • Trier
  • Transformer (Appliquer)
  • Limite
  • Filtre

Par exemple, prenons des envois dans un scénario de commerce électronique dans lequel vous disposez d’un horodatage et d’une taille totale de boîte (box_area) pour des millions d’envois au cours des dix dernières années. Supposons que vous vouliez trouver les trois premières années avec le plus d’expéditions de boîtes dont la superficie est supérieure à 300. Nous ne nous soucions pas du nombre exact ; nous voulons juste des chiffres approximatifs et ils doivent être bien formatés. Notre requête d’agrégation ressemblerait à ceci :

Cela ne ressemble probablement à aucune commande Redis que vous ayez jamais vue, mais lorsque vous la décomposez, ce n’est pas si compliqué.

FT.AGGREGATE shipments "@box_area:[300 +inf]" Dans l’indice “expéditions”, recherchez les éléments avec box_area supérieur à 300. Cela utilise la même syntaxe de requête que le reste de RediSearch.
APPLY "year(@shipment_timestamp)" AS shipment_year Cela transforme expédition_horodatage en un an avec la fonction incluse. Ce résultat sera désormais accessible en tant que expédition_année.
GROUPBY 1 @shipment_year REDUCE COUNT 0 AS shipment_count Regroupez tous les expédition_année résultats ensemble et comptez-les. Reportez-vous à ce résultat comme expedition_count.
SORTBY 2 @shipment_count DESC Nous allons trier ces valeurs dans l’ordre décroissant de nos décomptes calculés à partir de l’étape précédente.
LIMIT 0 3 Seules les trois premières valeurs nous intéressent.
APPLY "format("%sk+ Shipments",floor(@shipment_count / 1000))" AS shipment_count Transformez à nouveau le décompte. À partir de l’expression intérieure (à l’intérieur sol), nous ferons un peu d’arithmétique pour raccourcir les nombres puisque nous ne nous soucions pas des valeurs exactes. Ensuite, nous utiliserons sol supprimer quoi que ce soit après la virgule. Enfin, nous allons le formater en utilisant le printf formatage de style et référez-vous-y comme (encore) expedition_count.

Cela produit les résultats suivants :

1) (integer) 10
2) 1) "shipment_year"
   2) "2014"
   3) "shipment_count"
   4) "10k+ Shipments"
3) 1) "shipment_year"
   2) "2017"
   3) "shipment_count"
   4) "9k+ Shipments"
4) 1) "shipment_year"
   2) "2015"
   3) "shipment_count"
   4) "9k+ Shipments"

En organisant ces opérations ensemble, vous pouvez rapidement analyser vos données d’une manière auparavant impossible. C’est une fonctionnalité très profonde et étendue, plus grande que ce qui peut être facilement résumé dans ce billet de blog, il est donc préférable de la voir en action. Regardez cette vidéo pour voir Dvir faire la démonstration des agrégations :

Peu de temps après RedisConf, nous avons publié RediSearch 1.2.0, qui comprenait une série de nouvelles fonctionnalités :

Attributs de requête

Faire en sorte qu’une sous-requête modifie les clauses d’une requête. Cela permet :

~(ice cream sandwich) => { $weight: 0.5; }

La commande ci-dessus donne à tout document contenant “glace”, “crème” et “sandwich” un poids de 0,5. Vous pouvez également modifier les exigences de slop ($slop) et « dans l’ordre » ($inorder) en fonction d’une sous-requête.

Correspondance floue

Faites correspondre tous les éléments avec une distance de caractère unique. Par exemple, « %redis% » correspondrait non seulement à « redis », mais également à « jedis » et « predis ».

Mises à jour conditionnelles

Mettre à jour un document uniquement si une condition est remplie, telle que :

FT.ADD idx myDoc 1.0 
   REPLACE PARTIAL
   IF "@timestamp < 12313134523" 
   FIELDS 
       title "new title"

Ce code mettrait à jour le document ‘myDoc’ lorsque l’horodatage est inférieur à 12313134523. Il seulement mettre à jour le titre.

Échappement de la barre oblique inverse

Utilisez une barre oblique inverse comme échappement afin que les caractères de contrôle soient traités comme du texte normal. Cette requête rechercherait à la fois “hello-world” et “world” dans les documents indexés :

FT.SEARCH idx "hello-world world"

Prise en charge des synonymes

Dans une situation où vous avez des équivalents complets avec des orthographes différentes, la correspondance peut être délicate. Avec FT.SYNADD et FT.SYNUPDATE, vous pouvez ajouter des termes qui sont équivalents, et les documents ajoutés par la suite seront mis en correspondance. Étant donné ce qui suit :

FT.SYNADD idx hello hola hej bonjour

Tout nouveau document contenant l’un de ces termes serait mis en correspondance avec une requête comme celle-ci :

FT.SEARCH idx hej

Enfin, la version 1.2.0 était la dernière version de RediSearch dirigée par Dvir. Nous sommes tristes de le voir partir mais nous lui souhaitons bonne chance dans ses nouvelles aventures dans une nouvelle organisation (construire quelque chose, nous comprenons, c’est très cool et très différent de RediSearch). Ne vous inquiétez pas cependant, RediSearch est développé par une équipe complète de personnes ici à Redis qui continuera à innover et à faire avancer RediSearch.

Development Source

Related Posts

RLEC 4.2.1 apporte des contrôles granulaires à la haute disponibilité et aux performances

RLEC 4.2.1 apporte des contrôles granulaires à la haute disponibilité et aux performances

Comment HolidayMe utilise Redis Enterprise comme base de données principale

Comment HolidayMe utilise Redis Enterprise comme base de données principale

Annonce de RedisGears 1.0 : un moteur sans serveur pour Redis

Annonce de RedisGears 1.0 : un moteur sans serveur pour Redis

Clés Redis dans la RAM |  Redis

Clés Redis dans la RAM | Redis

No Comment

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *