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

Tablestore:検索インデックスの作成

最終更新日:Dec 28, 2024

TablestoreコンソールまたはTablestore CLIまたはTablestore SDKを使用して、テーブルに1つ以上の検索インデックスを作成できます。その後、検索インデックスを使用して、テーブル内のデータのクエリと分析を行うことができます。このトピックでは、検索インデックスを作成する方法について説明します。

検索インデックスを作成するための最適な方法

クエリ要件に基づいて、データテーブルに作成する検索インデックスの数を決定することをお勧めします。

id、name、age、city、およびsexフィールドを含むデータテーブルがある場合、次のいずれかの方法を使用して、name、age、またはcityでデータをクエリする検索インデックスを作成できます。

  • 方法1:フィールドごとに検索インデックスを作成する

    この方法を使用する場合、name_index、age_index、およびcity_indexという検索インデックスを作成する必要があります。

    • 都市別に学生をクエリするには、city_index検索インデックスを使用します。年齢別に学生をクエリするには、age_index検索インデックスを使用します。

    • ただし、12歳未満で都市Aに住んでいる学生をクエリする場合、この方法は機能しません。

    この方法の実装は、グローバルセカンダリインデックス機能の実装に似ています。ただし、この方法は費用対効果が高くありません。この場合は、方法2を使用することをお勧めします。

  • 方法2(推奨):複数のフィールドに1つの検索インデックスを作成する

    この方法では、student_indexという名前の検索インデックスが作成されます。この検索インデックスは、name、age、およびcityフィールドで構成されます。

    • 都市別に学生をクエリするには、student_index検索インデックスのcityフィールドをクエリします。年齢別に学生をクエリするには、student_index検索インデックスのageフィールドをクエリします。

    • 12歳未満で都市Aに住んでいる学生をクエリするには、student_index検索インデックスのageフィールドとcityフィールドをクエリします。

    この方法は、検索インデックスの利点を最大限に活用し、費用対効果が高くなります。検索インデックスを作成する場合は、この方法を使用することをお勧めします。

制限

  • 検索インデックス作成の適時性

    検索インデックスを作成した後、検索インデックスを使用できるようになるまで数秒待つ必要があります。この期間中、データテーブルにデータを書き込むことはできますが、インデックスのメタデータをクエリしたり、インデックスを使用してデータをクエリしたりすることはできません。

  • 検索インデックスを作成する場合は、検索インデックスのフィールドのタイプが、検索インデックスが作成されるデータテーブルのフィールドのタイプと一致していることを確認してください。詳細については、基本データ型のマッピングを参照してください。

  • 検索インデックスの数

    詳細については、検索インデックスの制限を参照してください。

パラメータ

検索インデックスを作成する場合は、tableName、indexName、およびindexSchemaパラメータを設定する必要があります。また、indexSchemaパラメータでfieldSchemas、indexSetting、およびindexSortパラメータを設定する必要があります。次の表に、パラメータを示します。

パラメータ

説明

tableName

データテーブルの名前。

indexName

検索インデックスの名前。

fieldSchemas

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

  • fieldName(必須):検索インデックスのフィールドの名前を指定します。値は列名として使用されます。タイプ:String。

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

  • fieldType(必須):フィールドのタイプ。FieldType.XXX形式でタイプを指定します。詳細については、基本データ型のマッピングを参照してください。

  • isAnArray(オプション):値が配列かどうかを指定します。タイプ:Boolean。

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

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

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

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

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

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

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

    重要

    このパラメータは、Tablestore SDKを使用してのみ設定できます。

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

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

    重要
    • このパラメータは、Tablestore SDKを使用してのみ設定できます。

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

  • 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パラメータを設定しない場合、フィールド値はプライマリキーでソートされます。

説明

fieldTypeパラメータをNestedに設定する場合は、indexSortパラメータを設定できません。

sorters(オプション):検索インデックスの事前ソート方法。有効な値:PrimaryKeySortとFieldSort。詳細については、ソートとページングの実行を参照してください。

timeToLive

オプション。検索インデックスのデータの保持期間。単位:秒。

デフォルト値は-1で、データが期限切れにならないことを指定します。有効期間(TTL)は、少なくとも86,400秒(1日)または-1である必要があります。値-1は、データが期限切れにならないことを指定します。

データの保持期間がtimeToLiveパラメータの値を超えると、データは期限切れになります。Tablestoreは期限切れのデータを自動的に削除します。

詳細については、検索インデックスのTTLの設定を参照してください。

使用上の注意

  • 全文検索を実行するには、検索インデックスのフィールドのタイプをTextに設定し、Textフィールドのアナライザーのタイプを指定します。その後、一致クエリまたは一致フレーズクエリを使用してデータをクエリできます。トークン化の詳細については、トークン化を参照してください。

  • データテーブルのフィールドを検索インデックスの仮想列にマッピングして、テーブルのストレージスキーマとデータを変更することなく、新しいフィールドと新しいフィールドタイプのデータをクエリできます。詳細については、仮想列を参照してください。

  • データテーブルのStringフィールドまたはIntegerフィールドを検索インデックスのDateフィールドにマッピングできます。これにより、Dateタイプのデータをクエリできます。詳細については、日付データ型を参照してください。

  • ベクトルに基づいて近似最近傍検索を実行する場合は、検索インデックスのフィールドのタイプをVectorに設定し、k最近傍(KNN)ベクトルクエリ機能を使用してデータをクエリできます。詳細については、概要を参照してください。

  • 検索インデックスにデータを配列として格納する場合は、データをデータテーブルのStringフィールドに格納し、検索インデックスのマッピングされたフィールドのタイプをArrayに設定できます。

    データテーブルにデータを書き込む場合、検索インデックスのArrayフィールドがマッピングされているフィールドの値はJSON配列である必要があります。例:["a","b","c"]。

    説明

    検索インデックスはArrayフィールドをサポートしています。ただし、データテーブルはArrayフィールドをサポートしていません。詳細については、Arrayデータ型とNestedデータ型を参照してください。

  • 階層関係または1対多関係を持つデータをフィールドに格納する場合は、検索インデックスのフィールドのタイプをNestedに設定し、ネストクエリを使用してデータをクエリできます。

    データテーブルにデータを書き込む場合、検索インデックスのNestedフィールドがマッピングされているフィールドの値はJSON配列である必要があります。例:[{"tagName":"tag1", "score":0.8}, {"tagName":"tag2", "score":0.2}]

  • データテーブルに格納するデータが地理位置情報である場合は、検索インデックスのフィールドのタイプをGeo-pointに設定し、地理距離クエリ地理境界ボックスクエリ、または地理ポリゴンクエリを使用してデータをクエリできます。

  • デフォルトでは、システムはパーティションキーをルーティングキーとして使用します。カスタムルーティングフィールドを指定して、他のプライマリキー列をルーティングキーとして使用できます。これにより、Tablestoreによってスキャンされるパーティション範囲が狭くなるため、クエリレイテンシが短縮されます。詳細については、ルーティングフィールドの使用方法を参照してください。

  • デフォルトでは、検索インデックスを使用してデータをクエリすると、クエリ結果はプライマリキーの昇順で返され、ソートされます。事前ソート方法を指定して、特定のフィールドの値に基づいて、またはプライマリキーの降順でクエリ結果をソートできます。詳細については、インデックスの事前ソートを参照してください。

  • TTL機能を使用して、検索インデックスの履歴データを自動的に削除できます。これにより、ストレージの使用量とストレージコストが削減されます。詳細については、検索インデックスのTTLの指定を参照してください。

  • クエリ結果で一致したクエリ文字列をハイライトする場合は、ハイライト機能を有効にすることができます。詳細については、ハイライトを参照してください。

方法

Tablestoreコンソールで、またはTablestore CLIまたはTablestore SDKを使用して、検索インデックスを作成できます。

検索インデックスを作成する前に、次の準備が完了していることを確認してください。

  • Alibaba CloudアカウントまたはTablestore操作権限を持つRAMユーザーが作成されています。RAMユーザーにTablestore操作権限を付与する方法については、RAMポリシーを使用してRAMユーザーに権限を付与するを参照してください。

    Tablestore SDKまたはTablestore CLIを使用して検索インデックスを作成する場合は、Alibaba CloudアカウントまたはRAMユーザーのAccessKeyペアが作成されます。詳細については、AccessKeyペアの作成を参照してください。

  • データテーブルが作成されています。詳細については、データテーブルの操作を参照してください。

  • Tablestore SDKを使用して検索インデックスを作成する場合は、OTSClientインスタンスが初期化されます。詳細については、OTSClientインスタンスの初期化を参照してください。

  • Tablestore CLIを使用して検索インデックスを作成する場合は、Tablestore CLIがダウンロードされ、予期どおりに起動されます。さらに、インスタンスアクセス情報が設定されます。詳細については、Tablestore CLIのダウンロードTablestore CLIの起動とアクセス情報の構成を参照してください。

Tablestoreコンソールの使用

Tablestoreコンソールで検索インデックスを作成できます。

  1. インデックスタブに移動します。

    1. Tablestoreコンソールにログインします。

    2. 上部のナビゲーションバーで、リソースグループとリージョンを選択します。

    3. 概要ページで、管理するインスタンスの名前をクリックするか、インスタンスのアクション列のインスタンスの管理をクリックします。

    4. インスタンスの詳細タブのテーブルタブで、検索インデックスを作成するデータテーブルの名前をクリックするか、データテーブルのアクション列のインデックスをクリックします。

  2. インデックスタブで、検索インデックスの作成をクリックします。

  3. インデックスの作成ダイアログボックスで、検索インデックスのパラメータを設定します。

    image.png

    1. システムによって生成されたデフォルトのインデックス名を保持するか、ビジネス要件に基づいてインデックス名を入力します。

    2. 検索インデックスのスキーマを生成するために使用するメソッドを選択します。

      重要

      フィールド名パラメータとフィールドタイプパラメータの値は、データテーブルのこれらのパラメータの値と一致する必要があります。データテーブルのフィールドタイプと検索インデックスのフィールドタイプのマッピングについては、基本データ型のマッピングを参照してください。

      • スキーマ生成タイプパラメータを手動に設定する場合は、フィールドの名前とタイプを指定します。ビジネス要件に基づいて、各フィールドの配列をオンにするかどうかを指定します。

      • スキーマ生成タイプパラメータを自動生成に設定すると、システムはデータテーブルのプライマリキー列と属性列をインデックスフィールドとして自動的に使用します。ビジネス要件に基づいて、フィールドタイプを選択し、配列をオンにするかどうかを指定できます。

      説明

      特定のケースでインデックス作成のパフォーマンスを最適化するには、仮想列を使用します。詳細については、仮想列を参照してください。

    3. ルーティングキー、有効期間、事前ソートなどの詳細設定を行う場合は、詳細設定をオンにします。次の表に、パラメータを示します。

      パラメータ

      説明

      ルーティングキー

      カスタムルーティングフィールド。1つ以上のプライマリキー列をルーティングフィールドとして選択できます。Tablestoreは、ルーティングフィールドの値に基づいてインデックスデータの分散を計算します。ルーティングフィールドの値が同じレコードは、同じデータパーティションに分散されます。

      有効期間

      検索インデックスのデータの保持期間。単位:秒。デフォルト値は-1で、データが期限切れにならないことを指定します。

      TTLは、少なくとも86,400秒(1日)または-1である必要があります。値-1は、データが期限切れにならないことを指定します。データテーブルに作成された検索インデックスのTTLは、データテーブルのTTL以下である必要があります。

      システムが検索インデックスの履歴データを自動的にクリアするようにするには、86400以上の値を指定します。保持期間がこのパラメータの値を超えると、データは期限切れになり、Tablestoreは期限切れのデータを自動的に削除します。

      事前ソート

      データが返されるデフォルトの順序。

      有効な値:デフォルトとカスタム。値「デフォルト」は、データがプライマリキーに基づいてソートされることを指定します。値「カスタム」は、データが指定したフィールドに基づいてソートされることを指定します。ビジネス要件に基づいて、事前ソートパラメータを設定します。

      重要

      Nestedフィールドを含む検索インデックスは、インデックスの事前ソートをサポートしていません。

  4. OKをクリックします。

    検索インデックスを作成した後、[インデックス]タブの検索インデックスのアクション列にあるインデックスの詳細をクリックします。[インデックスの詳細]ダイアログボックスで、[基本インデックス情報]、[インデックスメーター]、[ルーティングキー]、[インデックスフィールド]、および[事前ソート]セクションのパラメータ設定を表示できます。

Tablestore CLIの使用

Tablestore CLIを使用してcreate_search_indexコマンドを実行して、検索インデックスを作成できます。詳細については、検索インデックスを参照してください。

  1. create_search_indexコマンドを実行して、search_indexという名前の検索インデックスを作成します。

    create_search_index -n search_index
  2. プロンプトが表示されたら、インデックススキーマを入力します。

    インデックススキーマには、検索インデックスの設定(IndexSetting)、フィールドスキーマのリスト(FieldSchemas)、および検索インデックスの事前ソート設定(IndexSort)が含まれます。検索インデックスのスキーマの詳細については、検索インデックスの作成を参照してください。

     {
        "IndexSetting": { // 検索インデックスの設定
            "RoutingFields": null // ルーティングフィールド
        },
        "FieldSchemas": [ // フィールドスキーマのリスト
            {
                "FieldName": "gid", // フィールド名
                "FieldType": "LONG", // フィールドタイプ
                "Index": true, // インデックスを作成するかどうか
                "EnableSortAndAgg": true, // ソートと集計を有効にするかどうか
                "Store": true, // フィールド値を格納するかどうか
                "IsArray": false, // 値が配列かどうか
                "IsVirtualField": false // 仮想列かどうか
            },
            // ... その他のフィールドスキーマ
        ]
    }

Tablestore SDKの使用

次のTablestore SDKを使用して検索インデックスを作成できます。Java用Tablestore SDKGo用Tablestore SDKPython用Tablestore SDKNode.js用Tablestore SDK.NET用Tablestore SDK、およびPHP用Tablestore SDK。この例では、Java用Tablestore SDKを使用して検索インデックスを作成します。

デフォルト設定を使用して検索インデックスを作成する

次のサンプルコードは、デフォルト設定を使用して検索インデックスを作成する方法の例を示しています。この例では、検索インデックスは、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日間です。

// Java用Tablestore SDK 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);
}

次の手順

検索インデックスを作成した後、検索インデックスを使用してデータのクエリ、分析、およびエクスポートを行うことができます。

操作

使用可能な機能

データのクエリ

ビジネス要件に基づいてクエリ方法を選択します。

Search操作を呼び出してデータをクエリする場合、クエリ条件を満たす行をソートまたはページングできます。詳細については、ソートとページングの実行を参照してください。

データの分析

集計

データのエクスポート

パラレル スキャン

参照

検索インデックスを作成した後、ビジネス要件に基づいて検索インデックスに対して操作を実行できます。

  • 検索インデックスのTTLを指定して、検索インデックスの履歴データを削除したり、検索インデックスのデータの保持期間を延長したりできます。詳細については、検索インデックスのTTLを設定するを参照してください。

  • 検索インデックスのスキーマを動的に変更して、検索インデックスのインデックス列を追加、更新、または削除できます。詳細については、検索インデックスのスキーマを動的に変更するを参照してください。

  • ListSearchIndex操作を呼び出して、データテーブルに対して作成されたすべての検索インデックスをクエリできます。詳細については、検索インデックスをクエリするを参照してください。

  • DescribeSearchIndex操作を呼び出して、フィールド情報や検索インデックスの設定など、検索インデックスの説明をクエリできます。詳細については、検索インデックスの説明をクエリするを参照してください。

  • 不要になった検索インデックスを削除できます。詳細については、検索インデックスを削除するを参照してください。

  • SQLクエリ機能や、MaxCompute、Spark、Hive、HadoopMR、Function Compute、Flink、PrestoDBなどの計算エンジンを使用して、テーブル内のデータを計算および分析することもできます。詳細については、SQLクエリ概要を参照してください。

付録: ベクトルの距離測定アルゴリズム

次の表は、ベクトル間の距離を測定するために使用できるアルゴリズムについて説明しています。アルゴリズムを使用して得られる値が大きいほど、類似性が高いことを示します。

メトリックタイプ

パフォーマンス

説明

ユークリッド距離

(euclidean)

image

比較的高

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

ドット積

(dot_product)

image

最高

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

Float32ベクトルは、テーブルに書き込む前に正規化する必要があります。たとえば、L2ノルムを使用してFloat32ベクトルを正規化できます。テーブルに書き込む前にFloat32ベクトルを正規化しないと、クエリ結果の不正確さ、ベクトルインデックスの構築の遅延、クエリパフォーマンスの低下などの問題が発生する可能性があります。

コサイン類似度

(cosine)

image

比較的低

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

0が除数として使用されている場合、0を除数として使用できないため、コサイン類似度は計算できません。したがって、Float32ベクトルの2乗和は0にすることはできません。

コサイン類似度の計算プロセスは複雑です。データをテーブルに書き込む前にベクトルを正規化し、ドット積アルゴリズムを使用してベクトル間の距離を測定することをお勧めします。

次のサンプルコードは、ベクトルを正規化する方法の例を示しています。

  // ベクトルの正規化を行うサンプルコード
  public static float[] l2normalize(float[] v, boolean throwOnZero) {
    double squareSum = 0.0f;
    int dim = v.length;
    for (float x : v) {
      squareSum += x * x;
    }
    if (squareSum == 0) {
      if (throwOnZero) {
        throw new IllegalArgumentException("can't normalize a zero-length vector"); // 長さがゼロのベクトルは正規化できません
      } else {
        return v;
      }
    }
    double length = Math.sqrt(squareSum);
    for (int i = 0; i < dim; i++) {
      v[i] /= length;
    }
    return v;
  }