Início Rápido: Procurar no Azure Managed Instance para Apache Cassandra com o Índice Lucene (Pré-visualização)

O Índice Cassandra Lucene, derivado do Stratio Cassandra, é um plug-in para o Apache Cassandra que expande a funcionalidade de índice para fornecer capacidades de pesquisa de texto completas e pesquisas multivariáveis, geoespaciais e bitemporais gratuitas. É conseguido através de uma implementação baseada no Apache Lucene de índices secundários do Cassandra, em que cada nó do cluster indexa os seus próprios dados. Este início rápido demonstra como procurar no Azure Managed Instance para Apache Cassandra com o Índice Lucene.

Importante

O Índice Lucene está em pré-visualização pública. Esta funcionalidade é fornecida sem um contrato de nível de serviço e não é recomendada para cargas de trabalho de produção. Para obter mais informações, veja Termos Suplementares de Utilização para Pré-visualizações do Microsoft Azure.

Aviso

Uma limitação com o plug-in do índice Lucene é que as pesquisas entre partições não podem ser executadas apenas no índice – o Cassandra precisa de enviar a consulta para cada nó. Isto pode levar a problemas de desempenho (memória e carga da CPU) para pesquisas entre partições que podem afetar cargas de trabalho de estado estável.

Quando os requisitos de pesquisa forem significativos, recomendamos que implemente um datacenter secundário dedicado para ser utilizado apenas para pesquisas, com um número mínimo de nós, cada um com um número elevado de núcleos (mínimo de 16). Os espaços de chaves no seu datacenter primário (operacional) devem ser configurados para replicar dados para o seu datacenter secundário (pesquisa).

Pré-requisitos

  • Se não tiver uma subscrição do Azure, crie uma conta gratuita antes de começar.

  • Implementar um cluster do Azure Managed Instance para Apache Cassandra. Pode fazê-lo através do portal – os índices Lucene serão ativados por predefinição quando os clusters forem implementados a partir do portal. Se quiser adicionar índices Lucene a um cluster existente, clique Update no painel de descrição geral do portal, selecione Cassandra Lucene Indexe clique em atualizar para implementar.

    Captura de ecrã a mostrar a atualização das Propriedades do Cluster do Cassandra.

  • Ligue-se ao cluster a partir de CQLSH.

Criar dados com o Índice Lucene

  1. CQLSH Na janela de comandos, crie um espaço de chaves e uma tabela como abaixo:

       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. Agora, crie um índice secundário personalizado na tabela com o Índice 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. Insira os seguintes tweets de exemplo:

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

Controlar a consistência de leitura

  1. O índice que criou anteriormente irá indexar todas as colunas na tabela com os tipos especificados e o índice de leitura utilizado para pesquisa será atualizado uma vez por segundo. Em alternativa, pode atualizar explicitamente todas as partições horizontais de índice com uma pesquisa vazia com consistência ALL:

        CONSISTENCY ALL
        SELECT * FROM tweets WHERE expr(tweets_index, '{refresh:true}');
        CONSISTENCY QUORUM
    
  2. Agora, pode procurar tweets dentro de um determinado intervalo de datas:

        SELECT * FROM tweets WHERE expr(tweets_index, '{filter: {type: "range", field: "time", lower: "2023/03/01", upper: "2023/05/01"}}');
    
  3. Esta pesquisa também pode ser efetuada ao forçar uma atualização explícita das partições horizontais de índice envolvidas:

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

Procurar dados

  1. Para procurar os 100 tweets mais relevantes em que o campo corpo contém a expressão "Clique na minha ligação" dentro de um intervalo de datas específico:

        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 a pesquisa para obter apenas os tweets escritos por utilizadores cujos nomes começam com "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 obter os 100 resultados filtrados mais recentes, pode utilizar a opção de ordenação:

        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. A pesquisa anterior pode ser restrita a tweets criados perto de uma posição 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. Também é possível ordenar os resultados por distância até uma posição 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;
    

Passos seguintes

Neste início rápido, aprendeu a procurar um cluster do Azure Managed Instance para Apache Cassandra com a Lucene Search. Agora pode começar a trabalhar com o cluster: