全部產品
Search
文件中心

Tablestore:查詢後過濾

更新時間:Nov 28, 2025

查詢後過濾(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)

SearchRequest中SearchQuery的查詢過濾參數配置

  • Query(必選) Query:主查詢條件配置,支援多元索引的所有查詢類型。包含以下參數:

    名稱

    資料類型

    說明

    Type(必選)

    QueryType

    查詢類型。支援Search介面的全部查詢類型,不推薦使用MatchAllQuery。

    Query(必選)

    bytes

    查詢條件。

  • SearchFilter(可選) SearchFilter:二次過濾配置,對主查詢結果進行精細化篩選。包含以下參數:

    • Query(必選) Query:過濾查詢條件配置,僅支援特定查詢類型。包含以下參數:

      名稱

      資料類型

      說明

      Type(必選)

      QueryType

      查詢類型,僅支援TermQuery、TermsQuery、RangeQuery和ExistsQuery及這些查詢類型組成的BoolQuery。

      Query(必選)

      bytes

      查詢條件。

範例程式碼

以下樣本示範如何使用查詢後過濾功能:先通過主查詢條件匹配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)