查询后过滤

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

说明

如需使用查询后过滤功能,请加入钉钉群36165029092(表格存储技术交流群-3)联系表格存储技术支持开通。

功能介绍

查询后过滤(Filter)是一种不同于 Query 的查询语法,执行步骤在 Query 阶段执行后, 在 Aggregate 和 GroupBy 阶段执行之前。

主要作用是通过人为控制查询流程,优化查询优化器,将命中量大的查询条件从 Query 阶段移到 Filter 阶段可以大幅提升查询性能。

  • Query 阶段:支持多元索引的所有查询类型(例如范围查询、精确查询、模糊查询、地理位置查询等)和所有数据类型,用于从索引中初步检索符合条件的数据。

  • Filter 阶段:在Query 阶段的结果上进行二次筛选,仅支持Keyword、Long 和 Double 类型,查询语法支持精确查询、范围查询、存在性查询等类型

与其他过滤方式的对比

与 Elasticsearch post_filter 的区别

两者的区别主要是生效位置不同:

  1. Tablestore 中 Filter 的执行顺序:Query → Filter → Aggregate/TotalCount

  2. Elasticsearch 中 post_filter 的执行顺序:Query → Aggregate/TotalCount → PostFilter

与 Tablestore BoolQuery 中 Filter 的区别

BoolQuery 中 Filter 类似于 BoolQuery 中 Must,属于 Query 中的一个子功能。

使用限制

  • 必须与多元索引查询条件组合使用,支持精确查询(TermQuery)、多词精确查询(TermsQuery)、范围查询(RangeQuery)、列存在性查询(ExistsQuery)及其组合查询(BoolQuery)。

  • BoolQuery 查询时,仅支持必须匹配(mustQueries)、必须不匹配(mustNotQueries)、可选匹配(shouldQueries)子句,不支持过滤子句(filterQueries)。

  • 仅支持对不可分词字符串(Keyword)、长整型(Long)、双精度浮点型(Double)字段进行过滤,且字段必须启用排序统计(enableSortAndAgg)属性。

  • 查询后过滤不支持设置权重。

使用方式

当前支持通过Java SDKGo SDK进行查询后过滤。