Inicio rápido: Búsqueda en Azure Managed Instance for Apache Cassandra mediante Lucene Index (versión preliminar)

El índice de Lucene de Cassandra, derivado de Cassandra de Stratio, es un complemento para Apache Cassandra que amplía la funcionalidad de índice para proporcionar funcionalidades de búsqueda de texto completo y búsqueda multivariable, geoespacial y bitemporal gratuita. Se logra mediante una implementación basada en Apache Lucene de los índices secundarios de Cassandra, donde cada nodo del clúster indexa sus propios datos. En este inicio rápido se muestra cómo buscar en Azure Managed Instance for Apache Cassandra mediante el índice de Lucene.

Importante

El índice de Lucene está en versión preliminar pública. Esta característica se ofrece sin contrato de nivel de servicio y no se recomienda para cargas de trabajo de producción. Para más información, consulte Términos de uso complementarios de las Versiones Preliminares de Microsoft Azure.

Advertencia

Una limitación con el complemento de índice de Lucene es que las búsquedas entre particiones no se pueden ejecutar únicamente en el índice: Cassandra debe enviar la consulta a cada nodo. Esto puede provocar problemas con el rendimiento (memoria y carga de CPU) para las búsquedas entre particiones que pueden afectar a las cargas de trabajo de estado estable.

Cuando los requisitos de búsqueda son significativos, se recomienda implementar un centro de datos secundario dedicado que se usará solo para las búsquedas, con un número mínimo de nodos, cada uno con una gran cantidad de núcleos (mínimo 16). Los espacios de claves del centro de datos principal (operativo) deben configurarse para replicar datos en el centro de datos secundario (búsqueda).

Requisitos previos

  • Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.

  • Implemente un clúster de Azure Managed Instance for Apache Cassandra. Puede hacerlo mediante el portal: Los índices de Lucene se habilitarán de manera predeterminada cuando se implementen los clústeres desde el portal. Si desea agregar índices de Lucene a un clúster existente, haga clic Update en la hoja de información general del portal, seleccione Cassandra Lucene Index y haga clic en actualizar para implementar.

    Captura de pantalla de la actualización de las propiedades del clúster de Cassandra.

  • Conéctese al clúster desde CQLSH.

Creación de datos con el índice de Lucene

  1. En la ventana de comando CQLSH, cree un espacio de claves y una tabla como se indica a continuación:

       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. Ahora cree un índice secundario personalizado en la tabla mediante el índice de Lucene:

       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. Inserte los siguientes tweets de ejemplo:

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

Control de la coherencia de lectura

  1. El índice que creó anteriormente indexará todas las columnas de la tabla con los tipos especificados y el índice de lectura usado para la búsqueda se actualizará una vez por segundo. Como alternativa, puede actualizar explícitamente todas las particiones de índice con una búsqueda vacía con coherencia ALL:

        CONSISTENCY ALL
        SELECT * FROM tweets WHERE expr(tweets_index, '{refresh:true}');
        CONSISTENCY QUORUM
    
  2. Ahora, puede buscar tweets dentro de un intervalo de fechas determinado:

        SELECT * FROM tweets WHERE expr(tweets_index, '{filter: {type: "range", field: "time", lower: "2023/03/01", upper: "2023/05/01"}}');
    
  3. Esta búsqueda también se puede realizar al forzar una actualización explícita de las particiones de índice implicadas:

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

Búsqueda de datos

  1. Para buscar los 100 tweets más relevantes en los que el campo cuerpo contiene la frase "Hacer clic en mi vínculo" dentro de un intervalo de fechas determinado:

        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. Para refinar la búsqueda para obtener solo los tweets escritos por los usuarios cuyos nombres comienzan por "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. Para obtener los 100 resultados filtrados más recientes, puede usar la opción Ordenar:

        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 búsqueda anterior se puede restringir a los tweets creados cerca de una ubicación geográfica:

        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. También es posible ordenar los resultados por distancia a una ubicación geográfica:

        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;
    

Pasos siguientes

En este inicio rápido, aprendió a buscar un clúster de Azure Managed Instance for Apache Cassandra mediante la búsqueda de Lucene. Ahora puede empezar a trabajar con el clúster: