查询后过滤

查询后过滤(Filter)是表格存储多元索引(Search Index)新增的一种查询辅助功能,支持对 Query 结果再做一次过滤。该功能的目的主要是人工干预内部的查询优化器,强制某些查询条件在最后阶段执行,使用合理,可以大幅提高查询性能。

说明

如需使用请加入钉钉群36165029092(表格存储技术交流群-3)联系表格存储技术支持开通。

功能架构

查询后过滤基于多层查询架构实现:

  • 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)

SearchRequestSearchQuery的查询过滤参数配置

  • Query(必选) Query:主查询条件配置,支持多元索引的所有查询类型。包含以下参数:

    名称

    数据类型

    说明

    Type(必选)

    QueryType

    查询类型。支持Search接口的全部查询类型,不推荐使用MatchAllQuery。

    Query(必选)

    bytes

    查询条件。

  • SearchFilter(可选) SearchFilter:二次过滤配置,对主查询结果进行精细化筛选。包含以下参数:

    • Query(必选) Query:过滤查询条件配置,仅支持特定查询类型。包含以下参数:

      名称

      数据类型

      说明

      Type(必选)

      QueryType

      查询类型,仅支持TermQuery、TermsQuery、RangeQueryExistsQuery及这些查询类型组成的BoolQuery。

      Query(必选)

      bytes

      查询条件。

示例代码

以下示例演示如何使用查询后过滤功能:先通过主查询条件匹配col_keyword字段值为"value"的数据,然后使用过滤条件筛选col_long字段值在110之间的记录。

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)