Tablestore SDK for Go で Exists クエリを使用して、指定されたインデックスフィールドを含む行を検索します。
前提条件
Tablestore Go SDK をインストールし、クライアントを初期化します。
説明
Exists クエリは、フィールド値にかかわらず、指定されたインデックスフィールドを含む行にマッチします。クエリタイプを ExistsQuery に設定します。
多次元インデックスでは、以下のケースでフィールドが存在しないとみなされます。
-
データテーブルの行にそのフィールドが含まれていない場合。
-
フィールドがキーワードなどの基本型の配列としてインデックスされており、データテーブル内のフィールド値が空の配列である場合。
func (client *tablestore.TableStoreClient) Search(request *tablestore.SearchRequest) (*tablestore.SearchResponse, error)
次の例ではデータをクエリし、最大 10 行とマッチした行の総数を返します。
tableName := "example_table"
indexName := "example_index"
query := &search.ExistsQuery{FieldName: "status"}
searchQuery := search.NewSearchQuery().
SetQuery(query).
SetLimit(10).
SetGetTotalCount(true)
response, err := client.Search(&tablestore.SearchRequest{
TableName: tableName,
IndexName: indexName,
SearchQuery: searchQuery,
ColumnsToGet: &tablestore.ColumnsToGet{
ReturnAllFromIndex: true,
},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(response.TotalCount)
fmt.Println(response.Rows)
パラメーター
クエリリクエスト
request は tablestore.SearchRequest 型であり、以下のパラメーターを含みます。
|
名前 |
型 |
説明 |
|
TableName (必須) |
string |
データテーブルの名前。 |
|
IndexName (必須) |
string |
検索インデックスの名前。 |
|
SearchQuery (必須) |
search.SearchQuery |
クエリ条件および一般的なクエリ構成。 |
|
ColumnsToGet (オプション) |
*tablestore.ColumnsToGet |
返却カラムの構成。このパラメーターを省略すると、プライマリキー列のみが返されます。 |
|
RoutingValues (オプション) |
[]*tablestore.PrimaryKey |
カスタムルートフィールドのプライマリキー値。カスタムルーティングが設定されていない場合は、このパラメーターを省略します。 |
|
TimeoutMs (オプション) |
*int32 |
リクエストのタイムアウト期間(ミリ秒)。 |
クエリ構成
search.NewSearchQuery() を呼び出してクエリ構成を作成し、以下のメソッドで構成します。
|
名前 |
型 |
説明 |
|
SetQuery (必須) |
search.Query |
クエリ条件を指定します。 |
|
SetOffset (オプション) |
int32 |
開始位置を指定します。デフォルト値:0。オフセットベースのページネーションでは、Offset + Limit の合計が 100,000 を超えてはなりません。 |
|
SetLimit (オプション) |
int32 |
返却する行の最大数を指定します。デフォルト値:10。最大値:100。0 を指定すると、行は返されません。 |
|
SetCollapse (オプション) |
*search.Collapse |
クエリ結果を折りたたみます。詳細については、「クエリ結果の折りたたみ」をご参照ください。 |
|
SetSort (オプション) |
*search.Sort |
結果のソート順を指定します。詳細については、「結果のソートとページネーション」をご参照ください。 |
|
SetGetTotalCount (オプション) |
bool |
マッチしたすべての行をカウントするかどうかを指定します。デフォルト値:false。 |
|
SetToken (オプション) |
[]byte |
前回の応答で返された NextToken 値を指定します。このメソッドはトークンに前ページのソート条件が含まれているため、Sort をクリアします。トークンベースのページネーションを使用する場合は、Offset を指定しないでください。 |
|
SetSearchFilter (オプション) |
*search.SearchFilter |
クエリ後のフィルターを適用します。詳細については、「クエリ後のフィルターの使用」をご参照ください。 |
|
Aggregation (オプション) |
...search.Aggregation |
集約を構成します。詳細については、「集約」をご参照ください。 |
|
GroupBy (オプション) |
...search.GroupBy |
グループ化を構成します。詳細については、「集約」をご参照ください。 |
クエリ条件
クエリは search.ExistsQuery 型であり、以下のパラメーターを含みます。
|
名前 |
型 |
説明 |
|
FieldName (必須) |
string |
存在チェックを行うインデックスフィールドの名前。 |
返却カラム
request.ColumnsToGet は tablestore.ColumnsToGet 型であり、以下のパラメーターを含みます。
|
名前 |
型 |
説明 |
|
Columns (オプション) |
[]string |
返却する属性列。このパラメーターは、ReturnAll および ReturnAllFromIndex の両方が false の場合にのみ有効です。 |
|
ReturnAll (オプション) |
bool |
データテーブル内のすべての属性列を返すかどうかを指定します。デフォルト値:false。 |
|
ReturnAllFromIndex (オプション) |
bool |
インデックスされたすべての属性列を返すかどうかを指定します。デフォルト値:false。このパラメーターと ReturnAll を同時に true に設定しないでください。 |
応答
Search メソッドは tablestore.SearchResponse 値を返します。次の表は、コアビジネスフィールドについて説明しています。
|
名前 |
型 |
説明 |
|
TotalCount |
int64 |
マッチした行の総数。この値は SetGetTotalCount に依存します。 |
|
Rows |
[]*tablestore.Row |
現在のクエリで返された行。その数は SetLimit で指定された値を超えないように制限されます。 |
|
SearchHits |
[]*tablestore.SearchHit |
検索ヒット。ハイライト、ネストされた inner hits、または関連スコアを使用する場合にこのフィールドを読み取ります。 |
|
NextToken |
[]byte |
次のページ用のトークン。値が空でない場合は、次のクエリに渡します。 |
|
IsAllSuccess |
bool |
すべてのインデックスパーティションがクエリされたかどうかを示します。値が false の場合、部分的な結果が返され、TotalCount が実際のマッチ行数より少なくなる可能性があります。 |
|
AggregationResults |
search.AggregationResults |
集約結果。 |
|
GroupByResults |
search.GroupByResults |
グループ化結果。 |
使用例
Nested フィールドのサブフィールドをクエリする
Nested フィールドに対して Exists クエリを実行するには、ネストされたクエリ のサブクエリとして ExistsQuery を使用します。Path には Nested フィールドの完全なパスを、FieldName にはサブフィールドの完全なパスを設定します。
query := &search.NestedQuery{
Path: "contacts",
Query: &search.ExistsQuery{
FieldName: "contacts.phone",
},
ScoreMode: search.ScoreMode_None,
}
フィールドが存在しない行をクエリする
ExistsQuery を BoolQuery.MustNotQueries 内のサブクエリとして使用して、指定されたインデックスフィールドを含まない行にマッチさせます。
query := &search.BoolQuery{
MustNotQueries: []search.Query{
&search.ExistsQuery{FieldName: "status"},
},
}