クエリ後のフィルター (Filter) は、Tablestore の多次元インデックスの機能で、クエリ結果に追加のフィルターを適用します。これにより、内部のクエリ オプティマイザーを手動で制御し、特定のクエリ条件を最終段階で強制的に実行させることができます。この機能を正しく使用することで、クエリパフォーマンスを大幅に向上させることができます。
この機能を使用するには、Tablestore のテクニカルサポートに連絡して有効化を依頼する必要があります。
機能アーキテクチャ
クエリ後のフィルターは、多層クエリアーキテクチャに基づいています:
SearchRequest:クエリの最上位コンテナーです。テーブル名、インデックス名、および特定のクエリ構成が含まれます。
SearchQuery:コアとなるクエリ構成です。メインクエリ条件 (Query) とオプションのクエリフィルター (SearchFilter) が含まれます。
Query:メインクエリ条件です。多次元インデックスのすべてのクエリタイプとデータ型をサポートし、初期データ取得に使用されます。
SearchFilter:セカンダリフィルターです。メインクエリの結果を詳細にフィルタリングするためのフィルター条件が含まれます。
制限事項
クエリ後のフィルターは、多次元インデックスクエリと併用する必要があります。サポートされているクエリタイプは、TermQuery、TermsQuery、RangeQuery、ExistsQuery、および BoolQuery です。
BoolQuery の場合、`mustQueries`、`mustNotQueries`、および `shouldQueries` 句はサポートされていますが、`filterQueries` 句はサポートされていません。
フィルタリングは、`enableSortAndAgg` プロパティが有効になっている Keyword、Long、および Double 型のフィールドでのみサポートされます。
クエリ後のフィルターは、重みの設定をサポートしていません。
前提条件
メソッドの説明
func (tableStoreClient *TableStoreClient) Search(request *SearchRequest) (*SearchResponse, error)サンプルコード
この例では、クエリ後のフィルターの使用方法を示します。メインクエリを使用して `col_keyword` フィールドが "value" であるデータを照合し、次にフィルター条件を適用して `col_long` フィールドの値が 1 から 10 の間にあるレコードを選択します。
func queryFilterExample(client *tablestore.TableStoreClient) {
// [必須] ご利用のテーブル名に置き換えてください。
tableName := "<TABLE_NAME>"
// [必須] ご利用の多次元インデックス名に置き換えてください。
indexName := "<SEARCH_INDEX_NAME>"
// メインクエリを作成:完全一致のための TermsQuery。
termsQuery := &search.TermsQuery{
FieldName: "col_keyword",
Terms: []interface{}{"value"},
}
// フィルター条件を作成:col_long フィールドの値が (1, 10) の範囲内にある RangeQuery。
rangeQuery := &search.RangeQuery{
FieldName: "col_long",
From: int64(1), // 1 を除外します。
To: int64(10), // 10 を除外します。
// 境界値を含めるには、IncludeLower/IncludeUpper を明示的に設定します。Go SDK でのデフォルト値は true です。
// Java SDK の setFrom/setTo メソッドはデフォルトで境界値を除外しますが、Go SDK の動作はこれと一致しています。
}
// フィルターを組み立てます。
searchFilter := &search.SearchFilter{
Query: rangeQuery,
}
// これらを組み合わせて完全な SearchQuery を作成します。
searchQuery := search.NewSearchQuery()
searchQuery.SetQuery(termsQuery)
searchQuery.SetSearchFilter(searchFilter)
// リクエストを作成します。
searchRequest := &tablestore.SearchRequest{}
searchRequest.SetTableName(tableName)
searchRequest.SetIndexName(indexName)
searchRequest.SetSearchQuery(searchQuery)
// 返される列を設定:多次元インデックスからすべての列を返します。
columnsToGet := &tablestore.ColumnsToGet{
ReturnAllFromIndex: true,
}
searchRequest.SetColumnsToGet(columnsToGet)
resp, err := client.Search(searchRequest)
if err != nil {
log.Printf("Search failed: %v", err)
return
}
for _, row := range resp.Rows {
fmt.Printf("Row: %+v\n", row.PrimaryKey)
}
}クエリを構成して、特定の列またはすべての列を返すように設定できます。
columnsToGet := &tablestore.ColumnsToGet{ // 列を指定します。 Columns: []string{"col_long", "col_keyword"}, // または、すべての列を返します。 //ReturnAll: true, } searchRequest.SetColumnsToGet(columnsToGet)一致した行の総数をカウントするには、`totalCount` 機能を有効にしてから、応答からカウントを取得します。
// searchQuery で totalCount を有効にします。 searchQuery.SetGetTotalCount(true) // 応答から一致した行の総数を表示します。 fmt.Printf("Total Count (matched): %d\n", resp.TotalCount)