Démarrage rapide : effectuer une recherche dans Azure Managed Instance pour Apache Cassandra en utilisant Lucene Index (préversion)

Cassandra Lucene Index, dérivé de Stratio Cassandra, est un plug-in pour Apache Cassandra qui étend sa fonctionnalité d’index afin de fournir des fonctionnalités de recherche en texte intégral et une recherche gratuite multivariable, géospatiale et bitemporale. Elle est obtenue via une implémentation basée sur Apache Lucene des index secondaires Cassandra, où chaque nœud du cluster indexe ses propres données. Ce démarrage rapide montre comment rechercher Azure Managed Instance pour Apache Cassandra en tirant pari de Lucene Index.

Important

Lucene Index est en préversion publique. Cette fonctionnalité est fournie sans contrat de niveau de service et est déconseillée pour les charges de travail de production. Pour plus d’informations, consultez Conditions d’Utilisation Supplémentaires relatives aux Évaluations Microsoft Azure.

Avertissement

Une limitation avec le plug-in de Lucene Index est que des recherches entre partitions ne peuvent pas être exécutées uniquement dans l’index. Cassandra doit envoyer la requête à chaque nœud. Cela peut entraîner des problèmes de performances (charge de mémoire et du processeur) pour des recherches entre partitions qui peuvent affecter les charges de travail à l’état stable.

Lorsque des exigences de recherche sont importantes, nous vous recommandons de déployer un centre de données secondaire dédié à utiliser uniquement pour des recherches, avec un nombre minimal de nœuds, chacun ayant un nombre élevé de cœurs (16 minimum). Les espaces clés de votre centre de données principal (opérationnel) doivent ensuite être configurés pour répliquer des données vers votre centre de données secondaire (recherche).

Prérequis

  • Si vous n’avez pas d’abonnement Azure, créez un compte gratuit avant de commencer.

  • Déployez un cluster Azure Managed Instance pour Apache Cassandra. Vous pouvez le faire via le portail : les index Lucene sont activés par défaut lorsque des clusters sont déployés à partir du portail. Si vous souhaitez ajouter des index Lucene à un cluster existant, cliquez sur Update dans le panneau Vue d’ensemble du portail, sélectionnez Cassandra Lucene Index, puis cliquez sur Mettre à jour pour déployer.

    Capture d’écran des propriétés de mise à jour de cluster Cassandra.

  • Connectez-vous à votre cluster à partir de CQLSH.

Créer des données avec Lucene Index

  1. Dans votre fenêtre de commande CQLSH, créez un espace de clés et une table comme suit :

       CREATE KEYSPACE demo
       WITH REPLICATION = {'class': 'NetworkTopologyStrategy', 'datacenter-1': 3};
       USE demo;
       CREATE TABLE tweets (
          id INT PRIMARY KEY,
          user TEXT,
          body TEXT,
          time TIMESTAMP,
          latitude FLOAT,
          longitude FLOAT
       );
    
  2. Créez maintenant un index secondaire personnalisé sur la table en tirant parti de Lucene Index :

       CREATE CUSTOM INDEX tweets_index ON tweets ()
       USING 'com.stratio.cassandra.lucene.Index'
       WITH OPTIONS = {
          'refresh_seconds': '1',
          'schema': '{
             fields: {
                id: {type: "integer"},
                user: {type: "string"},
                body: {type: "text", analyzer: "english"},
                time: {type: "date", pattern: "yyyy/MM/dd"},
                place: {type: "geo_point", latitude: "latitude", longitude: "longitude"}
             }
          }'
       };
    
  3. Insérez les exemples de tweets suivants :

        INSERT INTO tweets (id,user,body,time,latitude,longitude) VALUES (1,'theo','Make money fast, 5 easy tips', '2023-04-01T11:21:59.001+0000', 0.0, 0.0);
        INSERT INTO tweets (id,user,body,time,latitude,longitude) VALUES (2,'theo','Click my link, like my stuff!', '2023-04-01T11:21:59.001+0000', 0.0, 0.0);
        INSERT INTO tweets (id,user,body,time,latitude,longitude) VALUES (3,'quetzal','Click my link, like my stuff!', '2023-04-02T11:21:59.001+0000', 0.0, 0.0);
        INSERT INTO tweets (id,user,body,time,latitude,longitude) VALUES (4,'quetzal','Click my link, like my stuff!', '2023-04-01T11:21:59.001+0000', 40.3930, -3.7328);
        INSERT INTO tweets (id,user,body,time,latitude,longitude) VALUES (5,'quetzal','Click my link, like my stuff!', '2023-04-01T11:21:59.001+0000', 40.3930, -3.7329);
    

Contrôler la cohérence de lecture

  1. L’index créé précédemment indexe toutes les colonnes de la table avec les types spécifiés, et l’index de lecture utilisé pour la recherche est actualisé une fois par seconde. Vous pouvez également actualiser explicitement toutes les partitions d’index avec une recherche vide avec la cohérence ALL :

        CONSISTENCY ALL
        SELECT * FROM tweets WHERE expr(tweets_index, '{refresh:true}');
        CONSISTENCY QUORUM
    
  2. Maintenant, vous pouvez rechercher des tweets dans une certaine plage de dates :

        SELECT * FROM tweets WHERE expr(tweets_index, '{filter: {type: "range", field: "time", lower: "2023/03/01", upper: "2023/05/01"}}');
    
  3. Cette recherche peut également être effectuée en forçant une actualisation explicite des partitions d’index impliquées :

        SELECT * FROM tweets WHERE expr(tweets_index, '{
           filter: {type: "range", field: "time", lower: "2023/03/01", upper: "2023/05/01"},
           refresh: true
        }') limit 100;
    

Rechercher des données

  1. Pour rechercher les 100 tweets les plus pertinents où le champ de corps contient l’expression « Cliquez sur mon lien » dans une plage de dates particulière :

        SELECT * FROM tweets WHERE expr(tweets_index, '{
           filter: {type: "range", field: "time", lower: "2023/03/01", upper: "2023/05/01"},
           query: {type: "phrase", field: "body", value: "Click my link", slop: 1}
        }') LIMIT 100;
    
  2. Pour affiner la recherche afin d’obtenir uniquement les tweets écrits par les utilisateurs dont le nom commence par « q » :

        SELECT * FROM tweets WHERE expr(tweets_index, '{
           filter: [
              {type: "range", field: "time", lower: "2023/03/01", upper: "2023/05/01"},
              {type: "prefix", field: "user", value: "q"}
           ],
           query: {type: "phrase", field: "body", value: "Click my link", slop: 1}
        }') LIMIT 100;
    
  3. Pour obtenir les 100 résultats filtrés les plus récents, vous pouvez utiliser l’option de tri :

        SELECT * FROM tweets WHERE expr(tweets_index, '{
           filter: [
              {type: "range", field: "time", lower: "2023/03/01", upper: "2023/05/01"},
              {type: "prefix", field: "user", value: "q"}
           ],
           query: {type: "phrase", field: "body", value: "Click my link", slop: 1},
           sort: {field: "time", reverse: true}
        }') limit 100;
    
  4. La recherche précédente peut être limitée aux tweets créés à proximité d’une position géographique :

        SELECT * FROM tweets WHERE expr(tweets_index, '{
           filter: [
              {type: "range", field: "time", lower: "2023/03/01", upper: "2023/05/01"},
              {type: "prefix", field: "user", value: "q"},
              {type: "geo_distance", field: "place", latitude: 40.3930, longitude: -3.7328, max_distance: "1km"}
           ],
           query: {type: "phrase", field: "body", value: "Click my link", slop: 1},
           sort: {field: "time", reverse: true}
        }') limit 100;
    
  5. Il est également possible de trier les résultats par distance à une position géographique :

        SELECT * FROM tweets WHERE expr(tweets_index, '{
           filter: [
              {type: "range", field: "time", lower: "2023/03/01", upper: "2023/05/01"},
              {type: "prefix", field: "user", value: "q"},
              {type: "geo_distance", field: "place", latitude: 40.3930, longitude: -3.7328, max_distance: "1km"}
           ],
           query: {type: "phrase", field: "body", value: "Click my link", slop: 1},
           sort: [
              {field: "time", reverse: true},
              {field: "place", type: "geo_distance", latitude: 40.3930, longitude: -3.7328}
           ]
        }') limit 100;
    

Étapes suivantes

Dans démarrage rapide, vous avez appris à effectuer une recherche de cluster Azure Managed Instance pour Apache Cassandra en utilisant Lucene Search. Vous pouvez maintenant commencer à utiliser le cluster :