次の方法で共有


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

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

重要

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

Lucene Index プラグインは、インデックス内でのみクロスパーティション検索を実行することはできません。 Cassandra は、各ノードにクエリを送信する必要があります。 この制限により、安定した状態のワークロードに影響する可能性があるパーティション間検索のパフォーマンス (メモリと CPU の負荷) に関する問題が発生する可能性があります。

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

前提条件

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

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

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

  • 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 回更新されます。 または、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 件のツイートを検索し、 body フィールドに特定の日付範囲内の Click my link 語句が含まれている場所を検索するには:

        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 Index を使用して Azure Managed Instance for Apache Cassandra クラスターを検索する方法について説明しました。 これで、クラスターの操作を開始できます。