Guida introduttiva: Cercare Azure Istanza gestita per Apache Cassandra usando Lucene Index (anteprima)

Cassandra Lucene Index, derivato da Stratio Cassandra, è un plug-in per Apache Cassandra che estende la funzionalità di indice per fornire funzionalità di ricerca full-text e ricerca multivariabile, geospaziale e bitemporal. Viene ottenuto tramite un'implementazione basata su Apache Lucene degli indici secondari Cassandra, in cui ogni nodo del cluster indicizza i propri dati. Questa guida introduttiva illustra come eseguire ricerche in Azure Istanza gestita per Apache Cassandra usando Lucene Index.

Importante

L'indice Lucene è disponibile in anteprima pubblica. Questa funzionalità viene fornita senza un contratto di servizio e non è consigliata per i carichi di lavoro di produzione. Per altre informazioni, vedere Condizioni supplementari per l'utilizzo delle anteprime di Microsoft Azure.

Avviso

Una limitazione con il plug-in dell'indice Lucene è che le ricerche tra partizioni non possono essere eseguite esclusivamente nell'indice - Cassandra deve inviare la query a ogni nodo. Ciò può causare problemi relativi alle prestazioni (carico di memoria e CPU) per le ricerche tra partizioni che possono influire sui carichi di lavoro di stato costante.

Se i requisiti di ricerca sono significativi, è consigliabile distribuire un data center secondario dedicato da usare solo per le ricerche, con un numero minimo di nodi, ognuno con un numero elevato di core (minimo 16). Gli spazi chiave nel data center primario (operativo) devono quindi essere configurati per replicare i dati nel data center secondario (ricerca).

Prerequisiti

  • Se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare.

  • Distribuire un Istanza gestita di Azure per il cluster Apache Cassandra. È possibile eseguire questa operazione tramite il portale : gli indici Lucene saranno abilitati per impostazione predefinita quando i cluster vengono distribuiti dal portale. Se si desidera aggiungere indici Lucene a un cluster esistente, fare clic nel pannello Panoramica del portale, selezionare Cassandra Lucene Indexe fare clic Update su Aggiorna per distribuire.

    Screenshot dell'aggiornamento delle proprietà del cluster Cassandra.

  • Connettersi al cluster da CQLSH.

Creare dati con Lucene Index

  1. CQLSH Nella finestra dei comandi creare un keyspace e una tabella come indicato di seguito:

       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. Creare ora un indice secondario personalizzato nella tabella usando 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. Inserire i tweet di esempio seguenti:

        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);
    

Controllare la coerenza di lettura

  1. L'indice creato in precedenza indicizza tutte le colonne della tabella con i tipi specificati e l'indice di lettura usato per la ricerca verrà aggiornato una volta al secondo. In alternativa, è possibile aggiornare in modo esplicito tutte le partizioni di indice con una ricerca vuota con coerenza ALL:

        CONSISTENCY ALL
        SELECT * FROM tweets WHERE expr(tweets_index, '{refresh:true}');
        CONSISTENCY QUORUM
    
  2. Ora è possibile cercare tweet all'interno di un determinato intervallo di date:

        SELECT * FROM tweets WHERE expr(tweets_index, '{filter: {type: "range", field: "time", lower: "2023/03/01", upper: "2023/05/01"}}');
    
  3. Questa ricerca può essere eseguita anche forzando un aggiornamento esplicito delle partizioni dell'indice coinvolte:

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

Ricerca dei dati

  1. Per cercare i primi 100 tweet più rilevanti in cui il campo corpo contiene la frase "Fare clic sul collegamento" all'interno di un determinato intervallo di date:

        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. Per perfezionare la ricerca per ottenere solo i tweet scritti dagli utenti i cui nomi iniziano con "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. Per ottenere i 100 risultati filtrati più recenti, è possibile usare l'opzione di ordinamento:

        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 ricerca precedente può essere limitata ai tweet creati vicino a una posizione geografica:

        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. È anche possibile ordinare i risultati in base alla distanza a una posizione geografica:

        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;
    

Passaggi successivi

In questa guida introduttiva si è appreso come cercare un Istanza gestita di Azure per il cluster Apache Cassandra usando Lucene Search. È ora possibile iniziare a usare il cluster: