Hızlı Başlangıç: Lucene Index (Önizleme) kullanarak Apache Cassandra için Azure Yönetilen Örneğinde arama

Stratio Cassandra'dan türetilen Cassandra Lucene Index, tam metin arama özellikleri ve ücretsiz çok değişkenli, jeo-uzamsal ve bitemporal arama sağlamak için dizin işlevselliğini genişleten bir Apache Cassandra eklentisidir. Bu, kümenin her düğümünün kendi verilerini dizinlediği Cassandra ikincil dizinlerinin Apache Lucene tabanlı uygulamasıyla elde edilir. Bu hızlı başlangıçta, Lucene Dizini kullanılarak Apache Cassandra için Azure Yönetilen Örneği'nin nasıl aranacakları gösterilmektedir.

Önemli

Lucene Index genel önizleme aşamasındadır. Bu özellik bir hizmet düzeyi sözleşmesi olmadan sağlanır ve üretim iş yükleri için önerilmez. Daha fazla bilgi için bkz. Microsoft Azure Önizlemeleri için Ek Kullanım Koşulları.

Uyarı

Lucene dizin eklentisiyle ilgili bir sınırlama, bölümler arası aramaların yalnızca dizinde yürütülememesidir. Cassandra'nın sorguyu her düğüme göndermesi gerekir. Bu, sürekli durum iş yüklerini etkileyebilecek bölümler arası aramalar için performans (bellek ve CPU yükü) ile ilgili sorunlara yol açabilir.

Arama gereksinimlerinin önemli olduğu durumlarda, her biri çok sayıda çekirdeğe (en az 16) sahip en az sayıda düğüme sahip, yalnızca aramalar için kullanılacak ayrılmış bir ikincil veri merkezi dağıtmanızı öneririz. Birincil (işlemsel) veri merkezinizdeki anahtar alanları daha sonra verileri ikincil (arama) veri merkezinize çoğaltacak şekilde yapılandırılmalıdır.

Ön koşullar

  • Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.

  • Apache Cassandra için Azure Yönetilen Örneği kümesi dağıtma. Bunu portal aracılığıyla yapabilirsiniz- Kümeler portaldan dağıtıldığında Lucene dizinleri varsayılan olarak etkinleştirilir. Mevcut bir kümeye Lucene dizinleri eklemek istiyorsanız portala genel bakış dikey penceresine tıklayın Update , öğesini seçin Cassandra Lucene Indexve dağıtmak için güncelleştir'e tıklayın.

    Cassandra Kümesi Özelliklerini Güncelleştirme ekran görüntüsü.

  • CQLSH'den kümenize bağlanın.

Lucene Index ile veri oluşturma

  1. Komut pencerenizde CQLSH aşağıdaki gibi bir keyspace ve tablo oluşturun:

       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. Şimdi Lucene Dizini'ni kullanarak tabloda özel bir ikincil dizin oluşturun:

       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. Aşağıdaki örnek tweet'leri ekleyin:

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

Okuma tutarlılığını denetleme

  1. Daha önce oluşturduğunuz dizin, tablodaki tüm sütunları belirtilen türlerle dizine alır ve arama için kullanılan okuma dizini saniyede bir kez yenilenir. Alternatif olarak, tüm dizin parçalarını tutarlılık ALL ile boş bir aramayla açıkça yenileyebilirsiniz:

        CONSISTENCY ALL
        SELECT * FROM tweets WHERE expr(tweets_index, '{refresh:true}');
        CONSISTENCY QUORUM
    
  2. Artık belirli bir tarih aralığında tweet arayabilirsiniz:

        SELECT * FROM tweets WHERE expr(tweets_index, '{filter: {type: "range", field: "time", lower: "2023/03/01", upper: "2023/05/01"}}');
    
  3. Bu arama, ilgili dizin parçalarının açık bir şekilde yenilenmesi zorunlu kılınarak da gerçekleştirilebilir:

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

Veri arama

  1. Gövde alanının belirli bir tarih aralığında "Bağlantıma tıklayın" ifadesini içerdiği en ilgili 100 tweet'i aramak için:

        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. Aramayı yalnızca adları "q" ile başlayan kullanıcılar tarafından yazılan tweet'leri alacak şekilde daraltmak için:

        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. Son filtrelenmiş 100 sonucu almak için sıralama seçeneğini kullanabilirsiniz:

        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. Önceki arama, coğrafi konuma yakın bir konumda oluşturulan tweet'lerle kısıtlanabilir:

        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. Sonuçları coğrafi konuma göre mesafeye göre sıralamak da mümkündür:

        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;
    

Sonraki adımlar

Bu hızlı başlangıçta, Lucene Search kullanarak Azure Yönetilen Örneği'nde Apache Cassandra kümesinde arama yapmayı öğrendiniz. Artık kümeyle çalışmaya başlayabilirsiniz: