クイック スタート: 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
] を選び、[更新] をクリックしてデプロイします。CQLSH からクラスターに接続します。
Lucene Index を使用してデータを作成する
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 );
次に、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"} } }' };
次のサンプル ツイートを挿入します。
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 回更新されます。 または、"CONSISTENCY ALL" を指定した空の検索で、すべてのインデックス シャードを明示的に更新できます。
CONSISTENCY ALL SELECT * FROM tweets WHERE expr(tweets_index, '{refresh:true}'); CONSISTENCY QUORUM
これで、特定の日付範囲内のツイートを検索できるようになりました。
SELECT * FROM tweets WHERE expr(tweets_index, '{filter: {type: "range", field: "time", lower: "2023/03/01", upper: "2023/05/01"}}');
この検索は、関連するインデックス シャードを明示的に更新することによっても実行できます。
SELECT * FROM tweets WHERE expr(tweets_index, '{ filter: {type: "range", field: "time", lower: "2023/03/01", upper: "2023/05/01"}, refresh: true }') limit 100;
データの検索
特定の日付範囲内で、本文フィールドに "リンクをクリック" というフレーズが含まれている上位 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;
名前が "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;
新しい順にフィルター処理された 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;
前の検索結果を、地理的に近い位置のツイートで絞り込めます。
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;
地理的位置までの距離で結果を並べ替えることもできます。
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 クラスターを検索する方法について学習しました。 これで、クラスターの操作を開始できます。