Snabbstart: Sök i Azure Managed Instance efter Apache Cassandra med Lucene Index (förhandsversion)

Cassandra Lucene Index, som härleds från Stratio Cassandra, är ett plugin-program för Apache Cassandra som utökar sina indexfunktioner för att ge fulltextsökningsfunktioner och gratis multivariable, geospatial och bitemporal sökning. Det uppnås genom en Apache Lucene-baserad implementering av sekundära Cassandra-index, där varje nod i klustret indexerar sina egna data. Den här snabbstarten visar hur du söker i Azure Managed Instance efter Apache Cassandra med hjälp av Lucene Index.

Viktigt!

Lucene Index är i offentlig förhandsversion. Den här funktionen tillhandahålls utan ett serviceavtal och rekommenderas inte för produktionsarbetsbelastningar. Mer information finns i Kompletterande villkor för användning av Microsoft Azure-förhandsversioner.

Varning

En begränsning med Plugin-programmet Lucene-index är att korspartitionssökningar inte kan köras enbart i indexet – Cassandra måste skicka frågan till varje nod. Detta kan leda till problem med prestanda (minne och CPU-belastning) för sökningar mellan partitioner som kan påverka arbetsbelastningar med stabilt tillstånd.

Om sökkraven är betydande rekommenderar vi att du distribuerar ett dedikerat sekundärt datacenter som endast ska användas för sökningar, med ett minimalt antal noder, var och en har ett stort antal kärnor (minst 16). Nyckelrymderna i ditt primära datacenter (drift) bör sedan konfigureras för att replikera data till ditt sekundära datacenter (sökning).

Förutsättningar

  • Om du inte har någon Azure-prenumeration skapar du ett kostnadsfritt konto innan du börjar.

  • Distribuera ett Azure Managed Instance för Apache Cassandra-kluster. Du kan göra detta via portalen – Lucene-index aktiveras som standard när kluster distribueras från portalen. Om du vill lägga till Lucene-index i ett befintligt kluster klickar du på Update portalöversiktsbladet, väljer Cassandra Lucene Indexoch klickar på Uppdatera för att distribuera.

    Skärmbild av Uppdatera Egenskaper för Cassandra-kluster.

  • Anslut till klustret från CQLSH.

Skapa data med Lucene Index

  1. CQLSH I kommandofönstret skapar du ett nyckelområde och en tabell enligt nedan:

       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. Skapa nu ett anpassat sekundärt index i tabellen med Hjälp av 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. Infoga följande exempel på tweets:

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

Kontrollera läskonsekvens

  1. Det index som du skapade tidigare indexeras alla kolumner i tabellen med de angivna typerna, och det läsindex som används för sökning uppdateras en gång per sekund. Du kan också uttryckligen uppdatera alla indexshards med en tom sökning med konsekvensEN ALLA:

        CONSISTENCY ALL
        SELECT * FROM tweets WHERE expr(tweets_index, '{refresh:true}');
        CONSISTENCY QUORUM
    
  2. Nu kan du söka efter tweets inom ett visst datumintervall:

        SELECT * FROM tweets WHERE expr(tweets_index, '{filter: {type: "range", field: "time", lower: "2023/03/01", upper: "2023/05/01"}}');
    
  3. Den här sökningen kan också utföras genom att tvinga fram en explicit uppdatering av de berörda indexshardsna:

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

Sök efter data

  1. Om du vill söka bland de 100 mest relevanta tweets där brödtextfältet innehåller frasen "Klicka på min länk" inom ett visst datumintervall:

        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. Så här förfinar du sökningen så att endast tweets skrivs av användare vars namn börjar med "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. Om du vill hämta de 100 senaste filtrerade resultaten kan du använda sorteringsalternativet:

        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. Den tidigare sökningen kan begränsas till tweets som skapats nära en geografisk position:

        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. Det är också möjligt att sortera resultaten efter avstånd till en geografisk position:

        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;
    

Nästa steg

I den här snabbstarten har du lärt dig hur du söker i ett Azure Managed Instance för Apache Cassandra-kluster med Hjälp av Lucene Search. Nu kan du börja arbeta med klustret: