CreateSearchIndex オペレーションを呼び出して、データテーブルに1つ以上の検索インデックスを作成できます。検索インデックスを作成する際に、クエリ対象のフィールドを検索インデックスに追加し、検索インデックスの詳細設定を行うことができます。たとえば、ルーティングキーと事前ソート設定を行うことができます。
前提条件
OTSClient インスタンスが初期化されていること。詳細については、OTSClient インスタンスを初期化するを参照してください。
maxVersions パラメータが 1 に設定されたデータテーブルが作成されていること。データテーブルの timeToLive パラメータは、以下のいずれかの条件を満たしている必要があります。詳細については、データテーブルを作成するを参照してください。
timeToLive パラメータが -1 に設定されていること。これは、データテーブル内のデータが期限切れにならないことを指定します。
timeToLive パラメータが -1 以外の値に設定されており、データテーブルの更新操作が禁止されていること。
検索インデックスでサポートされているフィールドタイプと、検索インデックスのフィールドタイプとデータテーブルのフィールドタイプのマッピングについて理解していること。詳細については、データ型を参照してください。
使用上の注意
検索インデックスのフィールドのデータ型は、検索インデックスが作成されるデータテーブルのフィールドのデータ型と一致している必要があります。詳細については、データ型を参照してください。
検索インデックスの timeToLive パラメータに -1 以外の値を指定するには、検索インデックスが作成されるデータテーブルの UpdateRow 操作を無効にする必要があります。さらに、検索インデックスの有効期間 (TTL) 値は、データテーブルの TTL 値以下である必要があります。詳細については、検索インデックスの TTL を設定するを参照してください。
API オペレーション
public class CreateSearchIndexRequest implements Request {
/** データテーブルの名前。 */
private String tableName;
/** 検索インデックスの名前。 */
private String indexName;
/** 検索インデックスのスキーマ。 */
private IndexSchema indexSchema;
/**
* ほとんどの場合、このパラメータを指定する必要はありません。
* 検索インデックスのスキーマが動的に変更される場合にのみ、セッターメソッドを使用してこのパラメータを指定できます。パラメータ値は、再インデックスに使用されるソース検索インデックスの名前です。
*/
private String sourceIndexName;
/** 検索インデックスのデータの TTL。単位:秒。検索インデックスを作成した後、UpdateSearchIndex オペレーションを呼び出して、このパラメータを動的に変更できます。 */
private Integer timeToLive;
}
public class IndexSchema implements Jsonizable {
/** 検索インデックスの設定。 */
private IndexSetting indexSetting;
/** 検索インデックスのすべてのフィールドのスキーマ。 */
private List<FieldSchema> fieldSchemas;
/** 検索インデックスの事前ソート設定。 */
private Sort indexSort;
}
パラメータ
検索インデックスを作成する際には、tableName、indexName、indexSchema パラメータを設定する必要があります。また、indexSchema パラメータ内の fieldSchemas、indexSetting、indexSort パラメータも設定する必要があります。次の表にパラメータを示します。
パラメータ | 説明 |
tableName | データテーブルの名前。 |
indexName | 検索インデックスの名前。 |
fieldSchemas | フィールドスキーマのリスト。各フィールドスキーマでは、次のパラメータを設定します。
|
indexSetting | routingFields パラメータを含む検索インデックスの設定。 routingFields: このパラメータはオプションであり、カスタムルーティングフィールドを指定します。特定のプライマリキー列をルーティングフィールドとして指定できます。Tablestore は、指定されたルーティングフィールドに基づいて、検索インデックスに書き込まれたデータを異なるパーティションに分散します。同じルーティングフィールド値を持つデータは、同じパーティションに分散されます。 |
indexSort | sorters パラメータを含む検索インデックスの事前ソート設定。indexSort パラメータを設定しない場合、フィールド値はプライマリキーでソートされます。 説明 Nested フィールドを含む検索インデックスの事前ソート設定はスキップできます。 sorters: このパラメータはオプションであり、検索インデックスの事前ソート方法を指定します。有効な値:PrimaryKeySort と FieldSort。詳細については、ソートとページングを実行するを参照してください。
|
sourceIndexName | このパラメータはオプションです。ほとんどの場合、このパラメータを設定する必要はありません。 検索インデックスのスキーマが動的に変更される場合にのみ、セッターメソッドを使用してこのパラメータを指定できます。パラメータ値は、再インデックスに使用されるソース検索インデックスの名前です。 |
timeToLive | このパラメータはオプションであり、検索インデックスのデータの保存期間を指定します。単位:秒。 デフォルト値:-1。-1 の値は、検索インデックスのデータが期限切れにならないことを指定します。このパラメータは、86400 以上または -1 の値に設定できます。86400 の値は、検索インデックスのデータの保存期間が1日であることを指定します。 データの保存期間が timeToLive パラメータの値を超えると、データは期限切れになります。Tablestore は期限切れのデータを自動的に削除します。 詳細については、検索インデックスの TTL を設定するを参照してください。 |
例
デフォルト設定を使用して検索インデックスを作成する
次のサンプルコードは、デフォルト設定を使用して検索インデックスを作成する方法の例を示しています。この例では、検索インデックスは、Keyword 型の Col_Keyword フィールド、Long 型の Col_Long フィールド、Vector 型の Col_Vector フィールドで構成されています。検索インデックスのデータは、データテーブルのプライマリキーに基づいて事前ソートされ、期限切れになりません。
private static void createSearchIndex(SyncClient client) {
CreateSearchIndexRequest request = new CreateSearchIndexRequest();
// データテーブルの名前を指定します。
request.setTableName("<TABLE_NAME>");
// 検索インデックスの名前を指定します。
request.setIndexName("<SEARCH_INDEX_NAME>");
IndexSchema indexSchema = new IndexSchema();
indexSchema.setFieldSchemas(Arrays.asList(
// フィールドの名前と型を指定します。
new FieldSchema("Col_Keyword", FieldType.KEYWORD),
new FieldSchema("Col_Long", FieldType.LONG),
// ベクトルの型を指定します。
new FieldSchema("Col_Vector", FieldType.VECTOR).setIndex(true)
// 次元数を 4 に設定し、ベクトルの距離測定アルゴリズムをドット積アルゴリズムに設定します。
.setVectorOptions(new VectorOptions(VectorDataType.FLOAT_32, 4, VectorMetricType.DOT_PRODUCT))
));
request.setIndexSchema(indexSchema);
// クライアントを呼び出して検索インデックスを作成します。
client.createSearchIndex(request);
}
indexSort パラメータを指定して検索インデックスを作成する
次のサンプルコードは、indexSort パラメータを指定して検索インデックスを作成する方法の例を示しています。この例では、検索インデックスは、Keyword 型の Col_Keyword フィールド、Long 型の Col_Long フィールド、Text 型の Col_Text フィールド、Long 型の Timestamp フィールドで構成されています。検索インデックスのデータは、Timestamp フィールドに基づいて事前ソートされます。
private static void createSearchIndexWithIndexSort(SyncClient client) {
CreateSearchIndexRequest request = new CreateSearchIndexRequest();
// データテーブルの名前を指定します。
request.setTableName("<TABLE_NAME>");
// 検索インデックスの名前を指定します。
request.setIndexName("<SEARCH_INDEX_NAME>");
IndexSchema indexSchema = new IndexSchema();
indexSchema.setFieldSchemas(Arrays.asList(
new FieldSchema("Col_Keyword", FieldType.KEYWORD),
new FieldSchema("Col_Long", FieldType.LONG),
new FieldSchema("Col_Text", FieldType.TEXT),
new FieldSchema("Timestamp", FieldType.LONG)
.setEnableSortAndAgg(true)));
// Timestamp フィールドに基づいてデータを事前ソートします。
indexSchema.setIndexSort(new Sort(
Arrays.<Sort.Sorter>asList(new FieldSort("Timestamp", SortOrder.ASC))));
request.setIndexSchema(indexSchema);
// クライアントを呼び出して検索インデックスを作成します。
client.createSearchIndex(request);
}
TTL を指定して検索インデックスを作成する
データテーブルの更新操作が禁止されていることを確認してください。
次のサンプルコードは、TTL を指定して検索インデックスを作成する方法の例を示しています。この例では、検索インデックスは、Keyword 型の Col_Keyword フィールドと Long 型の Col_Long フィールドで構成されています。検索インデックスの TTL は7日間です。
// Tablestore SDK for Java V5.12.0 以降を使用して検索インデックスを作成します。
public static void createIndexWithTTL(SyncClient client) {
int days = 7;
CreateSearchIndexRequest request = new CreateSearchIndexRequest();
// データテーブルの名前を指定します。
request.setTableName("<TABLE_NAME>");
// 検索インデックスの名前を指定します。
request.setIndexName("<SEARCH_INDEX_NAME>");
IndexSchema indexSchema = new IndexSchema();
indexSchema.setFieldSchemas(Arrays.asList(
// フィールドの名前と型を指定します。
new FieldSchema("Col_Keyword", FieldType.KEYWORD),
new FieldSchema("Col_Long", FieldType.LONG)));
request.setIndexSchema(indexSchema);
// 検索インデックスの TTL を指定します。
request.setTimeToLiveInDays(days);
// クライアントを呼び出して検索インデックスを作成します。
client.createSearchIndex(request);
}
仮想列を指定して検索インデックスを作成する
次のサンプルコードは、仮想列を指定して検索インデックスを作成する方法の例を示しています。この例では、検索インデックスは、Keyword 型の Col_Keyword フィールドと Long 型の Col_Long フィールドで構成されています。さらに、Long 型の Col_Keyword_Virtual_Long と Keyword 型の Col_Long_Virtual_Keyword という仮想列が作成されます。Col_Keyword_Virtual_Long フィールドはデータテーブルの Col_Keyword 列にマッピングされ、Col_Long_Virtual_Keyword フィールドはデータテーブルの Col_Long 列にマッピングされます。
private static void createSearchIndex(SyncClient client) {
CreateSearchIndexRequest request = new CreateSearchIndexRequest();
// データテーブルの名前を指定します。
request.setTableName("<TABLE_NAME>");
// 検索インデックスの名前を指定します。
request.setIndexName("<SEARCH_INDEX_NAME>");
IndexSchema indexSchema = new IndexSchema();
indexSchema.setFieldSchemas(Arrays.asList(
// フィールドの名前と型を指定します。
new FieldSchema("Col_Keyword", FieldType.KEYWORD),
// フィールドの名前と型を指定します。
new FieldSchema("Col_Keyword_Virtual_Long", FieldType.LONG)
// フィールドが仮想列かどうかを指定します。
.setVirtualField(true)
// データテーブルで仮想列がマッピングされるソースフィールドの名前を指定します。
.setSourceFieldName("Col_Keyword"),
new FieldSchema("Col_Long", FieldType.LONG),
new FieldSchema("Col_Long_Virtual_Keyword", FieldType.KEYWORD)
.setVirtualField(true)
.setSourceFieldName("Col_Long")));
request.setIndexSchema(indexSchema);
// クライアントを呼び出して検索インデックスを作成します。
client.createSearchIndex(request);
}
ハイライト機能を有効にして検索インデックスを作成する
次のサンプルコードは、ハイライト機能を有効にして検索インデックスを作成する方法の例を示しています。この例では、検索インデックスは、Keyword 型の Col_Keyword フィールド、Long 型の Col_Long フィールド、Text 型の Col_Text フィールドで構成されています。さらに、Col_Text フィールドでハイライト機能が有効になっています。
private static void createSearchIndexwithHighlighting(SyncClient client) {
CreateSearchIndexRequest request = new CreateSearchIndexRequest();
// データテーブルの名前を指定します。
request.setTableName("<TABLE_NAME>");
// 検索インデックスの名前を指定します。
request.setIndexName("<SEARCH_INDEX_NAME>");
IndexSchema indexSchema = new IndexSchema();
indexSchema.setFieldSchemas(Arrays.asList(
// フィールドの名前と型を指定します。
new FieldSchema("Col_Keyword", FieldType.KEYWORD),
new FieldSchema("Col_Long", FieldType.LONG),
// Col_Text フィールドでハイライト機能を有効にします。
new FieldSchema("Col_Text", FieldType.TEXT).setIndex(true).setEnableHighlighting(true)
));
request.setIndexSchema(indexSchema);
// クライアントを呼び出して検索インデックスを作成します。
client.createSearchIndex(request);
}
FAQ
関連情報
検索インデックスを作成した後、検索インデックスで提供されるクエリメソッドを使用して、ビジネス要件に基づいて多次元からデータをクエリできます。検索インデックスを使用してデータをクエリする場合は、次のクエリメソッドを使用できます。タームクエリ、タームズクエリ、マッチオールクエリ、マッチクエリ、マッチフレーズクエリ、プレフィックスクエリ、サフィックスクエリ、範囲クエリ、ワイルドカードクエリ、ジオクエリ、ブールクエリ、KNNベクトル検索、ネステッドクエリ、存在クエリ。
Search オペレーションを呼び出してデータをクエリする際に、結果セットをフィルタリングできます。
ソートおよびページング機能を使用して、クエリ条件に一致する行をソートまたはページングできます。詳細については、ソートとページングを実行するを参照してください。
ハイライト機能を使用して、クエリ結果のクエリ文字列をハイライト表示できます。詳細については、クエリ結果をハイライト表示するを参照してください。
折りたたみ(重複排除)機能を使用して、特定の列に基づいて結果セットを折りたたむことができます。これにより、指定された型のデータはクエリ結果に1回だけ表示されます。詳細については、折りたたみ(重複排除)を参照してください。
検索インデックスを作成した後、ビジネス要件に基づいて検索インデックスを管理できます。
検索インデックスのスキーマを動的に変更して、検索インデックスにインデックスフィールドを追加、更新、または削除できます。詳細については、検索インデックスのスキーマを動的に変更するを参照してください。
検索インデックスの TTL を変更して、検索インデックスの履歴データを削除したり、検索インデックスのデータの保存期間を延長したりできます。詳細については、検索インデックスの TTL を設定するを参照してください。
ListSearchIndex オペレーションを呼び出して、データテーブルに作成されたすべての検索インデックスをクエリできます。詳細については、検索インデックスを一覧表示するを参照してください。
DescribeSearchIndex オペレーションを呼び出して、検索インデックスの説明をクエリできます。たとえば、フィールド情報や検索インデックスの設定をクエリできます。詳細については、検索インデックスの説明をクエリするを参照してください。
不要になった検索インデックスを削除できます。詳細については、検索インデックスを削除するを参照してください。
テーブル内のデータを分析する場合、Search オペレーションを呼び出して集計機能を使用するか、SQL クエリ機能を使用できます。たとえば、最大値と最小値、値の合計、行数をクエリできます。詳細については、集計とSQL クエリを参照してください。
行をソートする必要なく、クエリ条件に一致するすべての行を取得する場合、ParallelScan オペレーションと ComputeSplits オペレーションを呼び出して並列スキャン機能を使用できます。詳細については、並列スキャンを参照してください。