CreateSearchIndex オペレーションを呼び出して、データテーブルの検索インデックスを作成できます。検索インデックスを作成する際に、クエリ対象のフィールドを検索インデックスに追加し、検索インデックスの詳細設定を構成できます。たとえば、ルーティングキーと事前ソート設定を構成できます。
前提条件
OTSClient インスタンスが初期化されていること。詳細については、OTSClient インスタンスの初期化を参照してください。
max_version パラメーターが 1 に設定されたデータテーブルが作成されていること。データテーブルの time_to_live パラメーターは、以下のいずれかの条件を満たしている必要があります。詳細については、データテーブルの作成を参照してください。
データテーブルの time_to_live パラメーターが -1 に設定されていること。これは、データテーブル内のデータが期限切れにならないことを指定します。
データテーブルの time_to_live パラメーターが -1 以外の値に設定されていること。更新を許可 パラメーターが いいえ に設定されていること。これは、データテーブルに対する更新操作が禁止されていることを指定します。
使用上の注意
検索インデックス内のフィールドのデータ型は、検索インデックスが作成されるデータテーブル内のフィールドのデータ型と一致している必要があります。詳細については、基本データ型のマッピングを参照してください。
検索インデックスの time_to_live パラメーターを -1 以外の値に設定するには、検索インデックスが作成されるデータテーブルで UpdateRow 操作が禁止されていることを確認してください。検索インデックスの time_to_live パラメーターの値は、データテーブルの time_to_live パラメーターの値以下である必要があります。詳細については、検索インデックスの TTL の指定を参照してください。
パラメーター
検索インデックスを作成する際には、table_name、index_name、および schema パラメーターを指定する必要があります。schema パラメーターでは、field_schemas、index_setting、および index_sort パラメーターを構成します。次の表に、上記のパラメーターについて説明します。
パラメーター | 説明 |
table_name | テーブルの名前。 |
index_name | 検索インデックスの名前。 |
field_schemas | フィールドスキーマのリスト。各フィールドスキーマでは、以下のパラメーターを構成します。
|
index_setting | 検索インデックスの設定。routing_fields パラメーターの設定を含みます。 routing_fields (オプション): カスタムルーティングフィールド。複数のプライマリキー列をルーティングフィールドとして指定できます。Tablestore は、指定されたルーティングフィールドに基づいて、検索インデックスに書き込まれたデータを異なるパーティションに分散します。同じルーティングフィールド値を持つデータは、同じパーティションに分散されます。 |
index_sort | 検索インデックスの事前ソート設定。sorters パラメーターの設定を含みます。index_sort パラメーターを構成しない場合、フィールド値はプライマリキーでソートされます。 説明 field_type パラメーターを Nested に設定した場合、indexSort パラメーターを構成することはできません。 sorters (必須): 検索インデックスの事前ソート方法。有効な値: PrimaryKeySort および FieldSort。詳細については、ソートとページングを参照してください。
|
例
アナライザータイプを指定して検索インデックスを作成する
次のサンプルコードは、アナライザータイプを指定して検索インデックスを作成する方法の例を示しています。この例では、検索インデックスは、Keyword タイプの k フィールド、Text タイプの t フィールド、Geo-point タイプの g フィールド、配列 Keyword タイプの ka フィールド、配列 Long タイプの la フィールド、および Nested タイプの n フィールドで構成されています。n フィールドは、Keyword タイプの nk サブフィールド、Long タイプの nl サブフィールド、および Text タイプの nt サブフィールドで構成されています。
def create_search_index(client):
# Keyword フィールドにインデックスを作成し、フィールドの集計機能を有効にします。
field_a = FieldSchema('k', FieldType.KEYWORD, index=True, enable_sort_and_agg=True, store=True)
# Text フィールドにインデックスを作成し、アナライザータイプを単一単語トークン化に設定します。
field_b = FieldSchema('t', FieldType.TEXT, index=True, store=True, analyzer=AnalyzerType.SINGLEWORD)
# Text フィールドにインデックスを作成し、アナライザータイプをあいまいトークン化に設定します。
#field_b = FieldSchema('t', FieldType.TEXT, index=True, store=True, analyzer=AnalyzerType.FUZZY,analyzer_parameter=FuzzyAnalyzerParameter(1, 6))
# Text フィールドにインデックスを作成し、アナライザータイプを区切り文字トークン化に設定します。
#field_b = FieldSchema('t', FieldType.TEXT, index=True, store=True, analyzer=AnalyzerType.SPLIT, analyzer_parameter = SplitAnalyzerParameter(","))
# Geo-point フィールドにインデックスを作成します。
field_c = FieldSchema('g', FieldType.GEOPOINT, index=True, store=True)
# 配列 Keyword フィールドにインデックスを作成します。
field_d = FieldSchema('ka', FieldType.KEYWORD, index=True, is_array=True, store=True)
# 配列 Long フィールドにインデックスを作成します。
field_e = FieldSchema('la', FieldType.LONG, index=True, is_array=True, store=True)
# Nested フィールドは、Keyword タイプの nk サブフィールド、Long タイプの nl サブフィールド、および Text タイプの nt サブフィールドの 3 つのサブフィールドで構成されています。
field_n = FieldSchema('n', FieldType.NESTED, sub_field_schemas=[
FieldSchema('nk', FieldType.KEYWORD, index=True, store=True),
FieldSchema('nl', FieldType.LONG, index=True, store=True),
FieldSchema('nt', FieldType.TEXT, index=True, store=True),
])
fields = [field_a, field_b, field_c, field_d, field_e, field_n]
index_setting = IndexSetting(routing_fields=['PK1'])
index_sort = None # 検索インデックスに Nested フィールドが含まれている場合、検索インデックスの事前ソートを構成することはできません。
#index_sort = Sort(sorters=[PrimaryKeySort(SortOrder.ASC)])
index_meta = SearchIndexMeta(fields, index_setting=index_setting, index_sort=index_sort)
client.create_search_index('<TABLE_NAME>', '<SEARCH_INDEX_NAME>', index_meta)
Vector フィールドを含む検索インデックスを作成する
次のサンプルコードは、Vector フィールドを含む検索インデックスを作成する方法の例を示しています。この例では、検索インデックスは、Keyword タイプの col_keyword フィールド、Long タイプの col_long フィールド、および Vector タイプの col_vector フィールドで構成されています。ベクトルの距離を測定するためにドット積アルゴリズムが使用されます。
def create_search_index(client):
index_meta = SearchIndexMeta([
FieldSchema('col_keyword', FieldType.KEYWORD, index=True, enable_sort_and_agg=True, store=True), # Keyword タイプ。
FieldSchema('col_long', FieldType.LONG, index=True, store=True), # Long タイプ。
FieldSchema("col_vector", FieldType.VECTOR, # Vector タイプ。
vector_options=VectorOptions(
data_type=VectorDataType.VD_FLOAT_32,
dimension=4, # ベクトルの次元数: 4。ベクトルに使用される距離測定アルゴリズム: ドット積。
metric_type=VectorMetricType.VM_DOT_PRODUCT
)),
])
client.create_search_index(table_name, index_name, index_meta)
ハイライト機能を有効にして検索インデックスを作成する
次のサンプルコードは、ハイライト機能を有効にして検索インデックスを作成する方法の例を示しています。この例では、検索インデックスは、Keyword タイプの k フィールド、Text タイプの t フィールド、および Nested タイプの n フィールドで構成されています。n フィールドは、Keyword タイプの nk サブフィールド、Long タイプの nk フィールド、および Text タイプの nt サブフィールドで構成されています。さらに、Text フィールドの t フィールドと nt サブフィールドでハイライト機能が有効になっています。
def create_search_index0905(client):
# Keyword フィールドにインデックスを作成し、フィールドの集計機能を有効にします。
field_a = FieldSchema('k', FieldType.KEYWORD, index=True, enable_sort_and_agg=True, store=True)
# Text フィールドにインデックスを作成し、フィールドのアナライザータイプを単一単語トークン化に設定し、フィールドのハイライト機能を有効にします。
field_b = FieldSchema('t', FieldType.TEXT, index=True, store=True, analyzer=AnalyzerType.SINGLEWORD,
enable_highlighting=True)
# Keyword タイプの nk フィールド、Long タイプの nl フィールド、および Text タイプの nt フィールドで構成される Nested フィールドにインデックスを作成します。Text タイプの nt サブフィールドでハイライト機能を有効にします。
field_n = FieldSchema('n', FieldType.NESTED, sub_field_schemas=[
FieldSchema('nk', FieldType.KEYWORD, index=True, store=True),
FieldSchema('nl', FieldType.LONG, index=True, store=True),
FieldSchema('nt', FieldType.TEXT, index=True, store=True, enable_highlighting=True),
])
fields = [field_a, field_b, field_n]
index_setting = IndexSetting(routing_fields=['id'])
index_sort = None # 検索インデックスに Nested フィールドが含まれている場合、検索インデックスの事前ソートを構成することはできません。
# index_sort = Sort(sorters=[PrimaryKeySort(SortOrder.ASC)])
index_meta = SearchIndexMeta(fields, index_setting=index_setting, index_sort=index_sort)
client.create_search_index('pythontest', 'pythontest_0905', index_meta)
FAQ
関連情報
検索インデックスを作成した後、検索インデックスで提供されるクエリメソッドを使用して、ビジネス要件に基づいて複数の次元からデータをクエリできます。検索インデックスは通常、以下のクエリメソッドを提供します。タームクエリ、タームズクエリ、マッチオールクエリ、マッチクエリ、マッチフレーズクエリ、プレフィックスクエリ、範囲クエリ、ワイルドカードクエリ、ジオクエリ、ブールクエリ、KNNベクトル検索、ネストクエリ、および 存在クエリ。
Search 操作を呼び出してデータをクエリする場合、ソートおよびページング機能を使用して、クエリ条件を満たす行をソートまたはページングできます。詳細については、ソートとページングを参照してください。
Search 操作を呼び出してデータをクエリする場合、折りたたみ (個別) 機能を使用して、特定のフィールドに基づいて結果セットを折りたたむことができます。このようにして、指定されたタイプのデータはクエリ結果に一度だけ表示されます。詳細については、折りたたみ (個別)を参照してください。
検索インデックスの TTL を指定して、検索インデックス内の履歴データを削除したり、検索インデックス内のデータの保持期間を延長したりできます。詳細については、検索インデックスの TTL の指定を参照してください。
テーブル内のデータを分析する場合、Search 操作を呼び出して集計機能または SQL クエリ機能を使用できます。たとえば、最大値と最小値、値の合計、および行数をクエリできます。詳細については、集計と SQL クエリを参照してください。
行をソートすることなく、クエリ条件を満たすすべての行を取得する場合、ParallelScan 操作と ComputeSplits 操作を呼び出して並列スキャン機能を使用できます。詳細については、並列スキャンを参照してください。
検索インデックスのスキーマを動的に変更して、検索インデックスにインデックスフィールドを追加、更新、または削除できます。詳細については、検索インデックスのスキーマの動的な変更を参照してください。
ListSearchIndex 操作を呼び出して、データテーブルに作成されたすべての検索インデックスをクエリできます。詳細については、検索インデックスの一覧表示を参照してください。
DescribeSearchIndex 操作を呼び出して、フィールド情報や検索インデックスの構成など、検索インデックスの説明をクエリできます。詳細については、検索インデックスの説明のクエリを参照してください。
不要になった検索インデックスを削除できます。詳細については、検索インデックスの削除を参照してください。