クイック スタート: Lucene Index を使用して Azure Managed Instance for Apache Cassandra を検索する (プレビュー)

Cassandra Lucene Index は、Stratio Cassandra から派生した Apache Cassandra 用プラグインであり、インデックス機能を拡張して、フルテキスト検索機能と、自由な多変量検索、地理空間検索、バイテンポラル検索を提供します。 これは、Apache Lucene ベースの Cassandra セカンダリ インデックスの実装によって実現されており、クラスターの各ノードでデータにインデックスを付けます。 このクイックスタートでは、Lucene Index を使用して Azure Managed Instance for Apache Cassandra を検索する方法について説明します。

重要

Lucene インデックスはパブリック プレビューの段階です。 この機能はサービス レベル アグリーメントなしで提供されています。運用環境のワークロードに使用することはお勧めできません。 詳しくは、Microsoft Azure プレビューの追加使用条件に関するページをご覧ください。

警告

Lucene インデックス プラグインの制限事項は、インデックスのみではパーティション間検索を実行できないことです。Cassandra は各ノードにクエリを送信する必要があります。 これにより、パーティション間検索でパフォーマンス イシュー (メモリと CPU の負荷) が発生することがあり、安定状態のワークロードが影響を受ける場合があります。

検索要件が重要な場合は、検索にのみ使用する専用のセカンダリ データ センターをデプロイすることをお勧めします。ノードの数は最小限にして、それぞれのノードにコア数を多く設定します (最小でも 16)。 プライマリ (運用) データ センターのキースペースは、セカンダリ (検索) データ センターにデータをレプリケートするように構成する必要があります。

前提条件

  • Azure サブスクリプションをお持ちでない場合は、開始する前に 無料アカウント を作成してください。

  • Azure Managed Instance for Apache Cassandra クラスターをデプロイします。 ポータルから実行できます。クラスターがポータルからデプロイされると、既定で Lucene インデックスが有効になります。 Lucene インデックスを既存のクラスターに追加する場合は、ポータルの [概要] ブレードで [Update] をクリックし、[Cassandra Lucene Index] を選び、[更新] をクリックしてデプロイします。

    Cassandra クラスター プロパティ 更新のスクリーンショット。

  • CQLSH からクラスターに接続します。

Lucene Index を使用してデータを作成する

  1. CQLSH コマンド ウィンドウで、次のようにキースペースとテーブルを作成します。

       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. 次に、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. 次のサンプル ツイートを挿入します。

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

読み取りの一貫性を制御する

  1. 前に作成したインデックスでは、指定した型を持つすべての列のインデックスがテーブル内に作成され、検索に使用される読み取りインデックスは 1 秒に 1 回更新されます。 または、"CONSISTENCY ALL" を指定した空の検索で、すべてのインデックス シャードを明示的に更新できます。

        CONSISTENCY ALL
        SELECT * FROM tweets WHERE expr(tweets_index, '{refresh:true}');
        CONSISTENCY QUORUM
    
  2. これで、特定の日付範囲内のツイートを検索できるようになりました。

        SELECT * FROM tweets WHERE expr(tweets_index, '{filter: {type: "range", field: "time", lower: "2023/03/01", upper: "2023/05/01"}}');
    
  3. この検索は、関連するインデックス シャードを明示的に更新することによっても実行できます。

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

データの検索

  1. 特定の日付範囲内で、本文フィールドに "リンクをクリック" というフレーズが含まれている上位 100 件の関連性の高いツイートを検索するには、次のように実行します。

        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. 名前が "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. 新しい順にフィルター処理された 100 件の結果をさらに取得するには、並べ替えオプションを使用できます。

        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. 前の検索結果を、地理的に近い位置のツイートで絞り込めます。

        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. 地理的位置までの距離で結果を並べ替えることもできます。

        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;
    

次の手順

このクイックスタートでは、Lucene 検索を使用して、Azure Managed Instance for Apache Cassandra クラスターを検索する方法について学習しました。 これで、クラスターの操作を開始できます。