すべてのプロダクト
Search
ドキュメントセンター

Tablestore:検索インデックスを作成する

最終更新日:Dec 28, 2024

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

フィールドスキーマのリスト。各フィールドスキーマでは、次のパラメータを設定します。

  • fieldName: このパラメータは必須であり、検索インデックスのフィールドの名前を指定します。値は列名として使用されます。型:String。

    検索インデックスのフィールドは、データテーブルのプライマリキー列または属性列にすることができます。

  • fieldType: このパラメータは必須であり、フィールドの型を指定します。FieldType.XXX 形式で型を指定します。詳細については、データ型を参照してください。

    説明
    • 複数レベルの論理関係でデータを格納およびクエリする場合、Nested フィールドを使用してデータを格納できます。詳細については、配列型と Nested 型を参照してください。

    • JSON 形式でデータを格納およびクエリする場合、JSON 形式のデータをデータテーブルの String フィールドに格納できます。次に、String フィールドを、データテーブル用に作成された検索インデックスの Array フィールドまたは Nested フィールドにマッピングし、Array フィールドまたは Nested フィールドを使用して JSON 形式のデータを柔軟にクエリできます。詳細については、配列型と Nested 型を参照してください。

    • 地理的な場所に関連するデータをクエリする場合、Geo-point フィールドにデータを格納できます。

  • Index: このパラメータはオプションであり、フィールドのインデックス作成を有効にするかどうかを指定します。型:Boolean。

    デフォルト値:true。true の値は、Tablestore が転置インデックスまたは時空間インデックススキーマを使用してフィールドにインデックスを作成することを指定します。false の値は、フィールドのインデックス作成が無効になっていることを指定します。

  • enableHighlighting: このパラメータはオプションであり、ハイライト機能を有効にするかどうかを指定します。型:Boolean。デフォルト値:false。false の値は、ハイライト機能が無効になっていることを指定します。このパラメータを true に設定すると、ハイライト機能を使用できます。Text フィールドのみがハイライト機能をサポートしています。詳細については、クエリ結果をハイライト表示するを参照してください。

  • analyzer: このパラメータはオプションであり、使用するアナライザの型を指定します。fieldType パラメータを Text に設定した場合、このパラメータを設定できます。このパラメータを設定しない場合、デフォルトのアナライザ型である単一単語トークン化が使用されます。詳細については、トークン化を参照してください。

  • analyzerParameter: このパラメータはオプションであり、アナライザの設定を指定します。指定したアナライザの型に基づいて、このパラメータを設定します。フィールドの analyzer パラメータを設定する場合、このパラメータを設定する必要があります。詳細については、トークン化を参照してください。

  • enableSortAndAgg: このパラメータはオプションであり、ソートと集計を有効にするかどうかを指定します。型:Boolean。デフォルト値:true。true の値は、ソートと集計が有効になっていることを指定します。

    ソートは、enableSortAndAgg パラメータが true に設定されているフィールドに対してのみ有効にできます。詳細については、ソートとページングを実行するを参照してください。

    重要

    Text フィールドでは、ソートと集計はサポートされていません。Text フィールドでソートまたは集計を実行する場合、仮想列機能を使用し、Text フィールドがマッピングされている仮想列の型を Keyword に設定できます。詳細については、仮想列を参照してください。

  • isAnArray: このパラメータはオプションであり、値が配列かどうかを指定します。型:Boolean。

    このパラメータを true に設定すると、フィールドはデータを配列として格納します。フィールドに書き込まれるデータは JSON 配列である必要があります。例: ["a","b","c"]

    Nested 値は配列です。fieldType パラメータを Nested に設定する場合は、このパラメータをスキップします。

  • subFieldSchemas: このパラメータは、サブフィールドのフィールドスキーマのリストを指定します。フィールドが Nested フィールドの場合、このパラメータを指定して、Nested フィールドのサブフィールドのインデックスタイプを設定する必要があります。

  • isVirtualField: このパラメータはオプションであり、フィールドが仮想列かどうかを指定します。型:Boolean。デフォルト値:false。このパラメータを true に設定すると、仮想列を使用できます。詳細については、仮想列を参照してください。

  • sourceFieldName: このパラメータはオプションであり、データテーブルで仮想列がマッピングされるソースフィールドの名前を指定します。型:String。isVirtualField パラメータを true に設定する場合、このパラメータを設定する必要があります。

  • dateFormats: このパラメータはオプションであり、日付の形式を指定します。型:String。fieldType パラメータを Date に設定する場合、このパラメータを設定する必要があります。詳細については、日付データ型を参照してください。

  • vectorOptions: このパラメータはオプションであり、Vector フィールドのプロパティを指定します。fieldType パラメータを Vector に設定する場合、このパラメータを設定する必要があります。次のパラメータを使用して、Vector フィールドのプロパティを指定できます。

    • dataType: ベクトルデータの型。float32 のみがサポートされています。他の型のベクトルデータを使用する場合は、チケットを提出してください。

    • dimension: ベクトルの次元数。ベクトルの次元数の制限については、検索インデックスの制限を参照してください。

    • metricType: ベクトル間の距離を測定するために使用するアルゴリズム。有効な値:euclidean、cosine、dot_product。

      • euclidean: 多次元空間における2つのベクトル間の最短パスを測定するユークリッド距離アルゴリズム。パフォーマンスを向上させるため、Tablestore のユークリッド距離アルゴリズムは最終的な平方根計算を実行しません。ユークリッド距離アルゴリズムを使用して得られた値が大きいほど、2つのベクトル間の類似性が高いことを示します。

      • cosine: ベクトル空間における2つのベクトル間の角度の余弦を計算するコサイン類似度アルゴリズム。コサイン類似度アルゴリズムを使用して得られた値が大きいほど、2つのベクトル間の類似性が高いことを示します。ほとんどの場合、このアルゴリズムはテキストデータ間の類似性を計算するために使用されます。

      • dot_product: 同じ次元の2つのベクトルの対応する座標を乗算し、積を加算するドット積アルゴリズム。ドット積アルゴリズムを使用して得られた値が大きいほど、2つのベクトル間の類似性が高いことを示します。

      詳細については、付録:ベクトル距離測定アルゴリズムを参照してください。

indexSetting

routingFields パラメータを含む検索インデックスの設定。

routingFields: このパラメータはオプションであり、カスタムルーティングフィールドを指定します。特定のプライマリキー列をルーティングフィールドとして指定できます。Tablestore は、指定されたルーティングフィールドに基づいて、検索インデックスに書き込まれたデータを異なるパーティションに分散します。同じルーティングフィールド値を持つデータは、同じパーティションに分散されます。

indexSort

sorters パラメータを含む検索インデックスの事前ソート設定。indexSort パラメータを設定しない場合、フィールド値はプライマリキーでソートされます。

説明

Nested フィールドを含む検索インデックスの事前ソート設定はスキップできます。

sorters: このパラメータはオプションであり、検索インデックスの事前ソート方法を指定します。有効な値:PrimaryKeySort と FieldSort。詳細については、ソートとページングを実行するを参照してください。

  • PrimaryKeySort: プライマリキーでデータをソートします。PrimaryKeySort には次のパラメータを設定できます。

    order: ソート順。データは昇順または降順でソートできます。デフォルト値:SortOrder.ASC。これは、データが昇順でソートされることを指定します。

  • FieldSort: 1つ以上のフィールドの値でデータをソートします。インデックス作成が有効で、enableSortAndAgg が true に設定されているフィールドのみを事前ソートできます。FieldSort には次のパラメータを設定できます。

    • fieldName: データのソートに使用するフィールドの名前。

    • order: ソート順。データは昇順または降順でソートできます。デフォルト値:SortOrder.ASC。これは、データが昇順でソートされることを指定します。

    • mode: フィールドに複数の値が含まれている場合に使用するソート方法。

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 オペレーションを呼び出して並列スキャン機能を使用できます。詳細については、並列スキャンを参照してください。