https://tech.revcomm.co.jp/partial-match-search-with-dynamodb
クエリに前方一致をかけられるわ。
https://qiita.com/YukiMiyatake/items/c3f13d32d90d15e5cfe0
GSIとLSI
https://makky12.hatenablog.com/entry/2020/02/14/000000
同じパーティションキーでソートキーを増やしたいだけなら、LSIとのこと。
曰く、LSIはソートキーを増やすのが目的なのだとか。
import boto3 # DynamoDBのリソースを作成 dynamodb = boto3.resource('dynamodb') # テーブル名とLSIの定義 table_name = 'YourTableName' lsi_name = 'OrgIndex' lsi_key_name = 'org' # LSIのソートキーの属性名 # テーブルの作成 table = dynamodb.create_table( TableName=table_name, KeySchema=[ { 'AttributeName': 'object_name', # パーティションキー 'KeyType': 'HASH' # ハッシュキーを指定 }, { 'AttributeName': 'id', # ソートキー 'KeyType': 'RANGE' # レンジキーを指定 } ], AttributeDefinitions=[ { 'AttributeName': 'object_name', 'AttributeType': 'S' # 文字列型 }, { 'AttributeName': 'id', 'AttributeType': 'S' # 文字列型 }, { 'AttributeName': 'org', 'AttributeType': 'S' # 文字列型 (LSIのソートキー) } ], BillingMode='PAY_PER_REQUEST', # On-Demand モードを指定 LocalSecondaryIndexes=[ { 'IndexName': lsi_name, 'KeySchema': [ { 'AttributeName': 'object_name', # パーティションキー 'KeyType': 'HASH' # ハッシュキーを指定 }, { 'AttributeName': 'org', # LSIのソートキー 'KeyType': 'RANGE' # レンジキーを指定 } ], 'Projection': { 'ProjectionType': 'ALL' # インデックスに含める属性の指定(ALLで全ての属性を含む) } } ] ) # テーブルの作成完了を待機 table.meta.client.get_waiter('table_exists').wait(TableName=table_name) # テーブルが作成されたことを確認 print(f'Table {table_name} created successfully with LSI {lsi_name}') # テーブルへのデータ挿入(例として) table.put_item( Item={ 'object_name': 'intestments', 'id': '1', 'org': 'MI事業本部', # その他の属性を必要に応じて追加 } ) # クエリの実行例 from boto3.dynamodb.conditions import Key # テーブルオブジェクトを取得 table = dynamodb.Table(table_name) # クエリの実行 response = table.query( IndexName=lsi_name, # 使用するインデックス名を指定 KeyConditionExpression=Key('object_name').eq('intestments') & Key('org').eq('MI事業本部') ) # 結果の表示 print('Query Results:') for item in response['Items']: print(item)
import boto3 from boto3.dynamodb.conditions import Key # DynamoDBのリソースを作成 dynamodb = boto3.resource('dynamodb') # テーブル名とLSIの定義 table_name = 'YourTableName' lsi_name = 'OrgIndex' # LSIの名前 # テーブルオブジェクトを取得 table = dynamodb.Table(table_name) # クエリの実行 response = table.query( IndexName=lsi_name, # 使用するLSIの名前を指定 KeyConditionExpression=Key('object_name').eq('intestments') & Key('org').begins_with('MI事業') ) # 結果の表示 print('Query Results:') for item in response['Items']: print(item)