検索インデックスは、Lastpoint インデックスからのデータ取得を高速化し、多次元クエリおよび統計分析機能を提供します。このトピックでは、Java SDK で検索インデックスを使用して Lastpoint インデックスデータを取得する方法について説明します。
考慮事項
Tablestore Java SDK は、バージョン 5.17.1 以降で Lastpoint インデックス機能をサポートしています。この機能を使用するには、SDK をバージョン 5.17.1 以降にアップグレードする必要があります。
Java SDK の新しいバージョンをダウンロードする必要がある場合は、「Java SDK バージョン履歴」をご参照ください。
開始前の準備
時系列テーブルに Lastpoint インデックスを作成済みであること。詳細については、「Lastpoint インデックスの作成」をご参照ください。
フローチャート
1. 検索インデックスを作成する
次の例は、Lastpoint インデックスの検索インデックスを作成する方法を示しています。サンプルのシナリオとデータについては、「付録」をご参照ください。
この例では、_tags 列は、タグで構成される文字列配列です。_tags 内のタグを簡単にクエリできるように、対応する検索インデックスフィールドタイプをキーワード配列に設定することをお勧めします。
private static void createSearchIndex(SyncClient client) {
CreateSearchIndexRequest createSearchIndexRequest = new CreateSearchIndexRequest();
createSearchIndexRequest.setTableName("");
createSearchIndexRequest.setIndexName("");
IndexSchema indexSchema = new IndexSchema();
indexSchema.setFieldSchemas(Arrays.asList(
new FieldSchema("_#h", FieldType.KEYWORD).setIndex(true).setEnableSortAndAgg(true),
new FieldSchema("_m_name", FieldType.KEYWORD).setIndex(true).setEnableSortAndAgg(true),
new FieldSchema("_data_source", FieldType.KEYWORD).setIndex(true).setEnableSortAndAgg(true),
new FieldSchema("_tags", FieldType.KEYWORD).setIndex(true).setEnableSortAndAgg(true).setIsArray(true),
new FieldSchema("_time", FieldType.LONG).setIndex(true).setEnableSortAndAgg(true),
new FieldSchema("gps", FieldType.GEO_POINT).setIndex(true).setEnableSortAndAgg(true),
new FieldSchema("speed", FieldType.DOUBLE).setIndex(true).setEnableSortAndAgg(true),
new FieldSchema("status", FieldType.KEYWORD).setIndex(true).setEnableSortAndAgg(true),
new FieldSchema("total_mileage", FieldType.DOUBLE).setIndex(true).setEnableSortAndAgg(true),
new FieldSchema("remaining_mileage", FieldType.DOUBLE).setIndex(true).setEnableSortAndAgg(true)
));
createSearchIndexRequest.setIndexSchema(indexSchema);
client.createSearchIndex(createSearchIndexRequest);
}2. 検索インデックスを使用してデータを取得する
次の例は、検索インデックスの範囲クエリ機能の使用方法を示しています。
この例では、検索インデックスを使用して、速度値が 20.0 より大きい Lastpoint インデックスから行を取得する方法を示します。
private static void rangeQuery(SyncClient client) {
SearchQuery searchQuery = new SearchQuery();
RangeQuery rangeQuery = new RangeQuery(); // クエリタイプを RangeQuery に設定します。
rangeQuery.setFieldName("speed"); // 一致するフィールドを設定します。
rangeQuery.greaterThan(ColumnValue.fromDouble(20.0)); // フィールドの範囲条件を 20.0 より大きく設定します。
searchQuery.setGetTotalCount(true);
searchQuery.setQuery(rangeQuery);
// 速度列で降順にソート順を設定します。
FieldSort fieldSort = new FieldSort("speed");
fieldSort.setOrder(SortOrder.DESC);
searchQuery.setSort(new Sort(Arrays.asList((Sort.Sorter)fieldSort)));
searchQuery.setGetTotalCount(true); // クエリ条件を満たす行の総数を返すように指定します。
SearchRequest searchRequest = new SearchRequest("", "", searchQuery);
// columnsToGet パラメーターを設定して、返される列を指定するか、すべての列が返されるように指定できます。このパラメーターを設定しない場合は、プライマリキー列のみが返されます。
SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet();
columnsToGet.setReturnAll(true); // すべての列を返すように設定します。
searchRequest.setColumnsToGet(columnsToGet);
SearchResponse resp = client.search(searchRequest);
System.out.println("TotalCount: " + resp.getTotalCount()); // 返された行数ではなく、一致した行の総数を表示します。
System.out.println("Row: " + resp.getRows());
}FAQ
関連情報
検索インデックスのコア機能には、任意の列(プライマリキー列と属性列を含む)のクエリ、ブールクエリ、ジオクエリ、フルテキストインデックス、あいまい検索、プレフィックスクエリ、ネストされたクエリ、重複の削除、ソート、行の総数のクエリ、および統計的集計が含まれます。詳細については、「検索インデックスの機能」をご参照ください。
付録
Internet of Vehicles(IoV)のシナリオでは、センサーが車両の時系列データをクラウドに報告します。ユーザーは、時系列データを保存、クエリ、および分析して、車両ステータスレポート、車両測位、交通管理、車両軌跡の画面ミラーリングなどのビジネス要件を満たすことができます。
時系列テーブルのサンプルデータは次のとおりです。
この例では、_m_name、_data_source、および _tags は時系列識別子であり、時系列のメジャー名、データソース、およびタグ情報を表します。_time はデータレポート時間です。gps、speed、status、total_mileage、および remaining_mileage は時系列の時系列データであり、車両の GPS 座標、速度、ステータス、総走行距離、および残り走行距離を表します。
_m_name | _data_source | _tags | _time | gps | speed | status | total_mileage | remaining_mileage |
Platform A | sensor1 | ["region=hangzhou","car_model=sedan","number_plate=ZheA D7512*","color=white"] | 1730422800000000 | 30.245853,120.178564 | 0 | Idle | 20000 | 450 |
Platform A | sensor1 | ["region=hangzhou","car_model=sedan","number_plate=ZheA D7512*","color=white"] | 1730423400000000 | 30.245853,120.178564 | 0 | Idle | 20000 | 450 |
Platform A | sensor2 | ["region=hangzhou","car_model=suv","number_plate=ZheC 72B2*","color=black"] | 1730779200000000 | 30.245278,120.150269 | 50 | Active | 15000 | 300 |
Platform A | sensor2 | ["region=hangzhou","car_model=suv","number_plate=ZheC 72B2*","color=black"] | 1730779800000000 | 30.245853,120.213654 | 80 | Active | 15050 | 250 |
Platform B | sensor3 | ["region=hangzhou","car_model=sedan","number_plate=ZheB 121*9","color=blue"] | 1730862000000000 | 30.246013,120.124470 | 60 | Active | 18200 | 300 |
Platform B | sensor3 | ["region=hangzhou","car_model=sedan","number_plate=ZheB 121*9","color=blue"] | 1730862600000000 | 30.246022,120.124460 | 0 | Idle | 18230 | 270 |
Tablestore は、時系列テーブルから Lastpoint インデックステーブルに時系列の最新時点データを自動的に同期します。Lastpoint インデックスのサンプルデータは次のとおりです。
_#h | _m_name | _data_source | _tags | _time | gps | speed | status | total_mileage | remaining_mileage |
4c#Platform A#07 | Platform A | sensor1 | ["region=hangzhou","car_model=sedan","number_plate=ZheA D7512*","color=white"] | 1730423400000000 | 30.245853,120.178564 | 0 | Idle | 20000 | 450 |
25#Platform A#ae | Platform A | sensor2 | ["region=hangzhou","car_model=suv","number_plate=ZheC 72B2*","color=black"] | 1730779800000000 | 30.245853,120.213654 | 80 | Active | 15050 | 250 |
b2#Platform B#4b | Platform B | sensor3 | ["region=hangzhou","car_model=sedan","number_plate=ZheB 121*9","color=blue"] | 1730862600000000 | 30.246022,120.124460 | 0 | Idle | 18230 | 270 |