查詢後過濾(Filter)是Table Store多元索引(Search Index)新增的一種查詢協助工具功能,支援對 Query 結果再做一次過濾。該功能的目的主要是人工幹預內部的查詢最佳化工具,強制某些查詢條件在最後階段執行,使用合理,可以大幅提高查詢效能。
如需使用請聯絡Table Store支援人員開通。
功能架構
查詢後過濾基於多層查詢架構實現:
SearchRequest:查詢請求的頂層容器,包含表名、索引名和具體的查詢配置。
SearchQuery:核心查詢配置,包含主查詢條件(Query)和可選的查詢過濾器(SearchFilter)。
Query:主查詢條件,支援多元索引的所有查詢類型和資料類型,用於初次資料檢索。
SearchFilter:二次過濾器,包含過濾查詢條件,在主查詢結果基礎上進行精細化篩選。
使用限制
必須與多元索引查詢條件組合使用,支援精確查詢(TermQuery)、多詞精確查詢(TermsQuery)、範圍查詢(RangeQuery)、列存在性查詢(ExistsQuery)及其組合查詢(BoolQuery)。
BoolQuery 查詢時,僅支援必須匹配(mustQueries)、必須不匹配(mustNotQueries)、可選匹配(shouldQueries)子句,不支援過濾子句(filterQueries)。
僅支援對不可分詞字串(Keyword)、長整型(Long)、雙精確度浮點型(Double)欄位進行過濾,且欄位必須啟用排序統計(enableSortAndAgg)屬性。
查詢後過濾不支援設定權重。
前提條件
在資料表上建立多元索引。
方法說明
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"},
}
// 構建過濾條件:RangeQuery,col_long 欄位取值範圍 (1, 10)
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 行為一致
}
// 組裝 Filter
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)