聚合查询

对查询结果进行分组和聚合

聚合查询允许您执行以下操作

  • 应用简单的映射函数。
  • 根据字段值对数据进行分组。
  • 对分组数据应用聚合函数。

本文介绍了 FT.AGGREGATE 命令的基本用法。有关更多详细信息,请参阅 命令规范聚合参考文档

本文中的示例使用以下字段的模式

字段名称 字段类型
条件 TAG
price NUMERIC

简单映射

APPLY 子句允许您对根据查询表达式返回的结果集应用简单的映射函数。

FT.AGGREGATE index "query_expr" LOAD n "field_1" .. "field_n" APPLY "function_expr" AS "result_field"

以下是查询语法的更详细解释

  1. 查询表达式:您可以使用与使用 FT.SEARCH 命令相同的查询表达式。您可以将 query_expr 替换为本查询主题 文章中解释的任何表达式。矢量搜索查询是一个例外。您不能将矢量搜索与聚合查询结合使用。
  2. 已加载的字段:如果字段值尚未加载到聚合管道中,您可以通过 LOAD 子句强制其存在。此子句采用字段数量 (n),后跟字段名称 ("field_1" .. "field_n")。
  3. 映射函数:此映射函数对字段值进行操作。在函数表达式中,特定字段被引用为 @field_name。结果将作为 result_field 返回。

以下示例展示了如何计算新自行车的折扣价

FT.AGGREGATE idx:bicycle "@condition:{new}" LOAD 2 "__key" "price" APPLY "@price - (@price * 0.1)" AS "discounted"

字段 __key 是一个内置字段。

此查询的输出为

1) "1"
2) 1) "__key"
   1) "bicycle:0"
   2) "price"
   3) "270"
   4) "discounted"
   5) "243"
3) 1) "__key"
   1) "bicycle:5"
   2) "price"
   3) "810"
   4) "discounted"
   5) "729"
4) 1) "__key"
   1) "bicycle:6"
   2) "price"
   3) "2300"
   4) "discounted"
   5) "2070"
...

使用聚合进行分组

前面的示例没有对数据进行分组。您可以通过以下方式根据一个或多个条件对数据进行分组和聚合

FT.AGGREGATE index "query_expr" ...  GROUPBY n "field_1" .. "field_n" REDUCE AGG_FUNC m "@field_param_1" .. "@field_param_m" AS "aggregated_result_field"

以下是对附加结构的解释

  1. 分组:您可以根据一个或多个字段进行分组。然后,每个有序的字段值序列定义一个组。也可以根据之前 APPLY ... AS 的结果进行分组。
  2. 聚合:您必须将 AGG_FUNC 替换为支持的聚合函数之一(例如,SUMCOUNT)。聚合参考文档 中提供所有函数的完整列表。将 aggregated_result_field 替换为您选择的任何值。

以下查询展示了如何根据 condition 字段进行分组,并根据之前得出的 price_category 应用缩减。表达式 @price<1000 会导致自行车的价格类别为 1,如果其价格低于 1000 美元。否则,其价格类别为 0。输出是按价格类别分组的负担得起的自行车的数量。

FT.AGGREGATE idx:bicycle "*" LOAD 1 price APPLY "@price<1000" AS price_category GROUPBY 1 @condition REDUCE SUM 1 "@price_category" AS "num_affordable"
1) "3"
2) 1) "condition"
   1) "refurbished"
   2) "num_affordable"
   3) "1"
3) 1) "condition"
   1) "used"
   2) "num_affordable"
   3) "1"
4) 1) "condition"
   1) "new"
   2) "num_affordable"
   3) "3"
注意
您还可以使用 FT.AGGREGATE 创建更复杂的聚合管道。可以在一个 GROUPBY 子句下应用多个缩减函数。此外,您还可以链接分组并将额外的映射步骤混合在一起(例如,GROUPBY ... REDUCE ... APPLY ... GROUPBY ... REDUCE

无分组聚合

您不能在 GROUPBY 子句之外使用聚合函数,但您可以构建管道,使聚合在一个跨越所有文档的单个组上进行。如果您的文档没有共享的共同属性,您可以通过额外的 APPLY 步骤添加它。

以下示例在对所有文档进行计数之前,向每个文档添加类型属性 bicycle

FT.AGGREGATE idx:bicycle "*" APPLY "'bicycle'" AS type GROUPBY 1 @type REDUCE COUNT 0 AS num_total

结果是

1) "1"
2) 1) "type"
   1) "bicycle"
   2) "num_total"
   3) "10"

无聚合分组

有时需要对数据进行分组,而无需应用数学聚合函数。如果您需要一个分组的值列表,那么 TOLIST 函数很有用。

以下示例展示了如何按 condition 对所有自行车进行分组

FT.AGGREGATE idx:bicycle "*" LOAD 1 "__key" GROUPBY 1 "@condition" REDUCE TOLIST 1 "__key" AS bicylces

此查询的输出为

1) "3"
2) 1) "condition"
   1) "refurbished"
   2) "bicylces"
   3) 1) "bicycle:9"
3) 1) "condition"
   1) "used"
   2) "bicylces"
   3) 1) "bicycle:1"
      1) "bicycle:2"
      2) "bicycle:3"
      3) "bicycle:4"
4) 1) "condition"
   1) "new"
   2) "bicylces"
   3) 1) "bicycle:0"
      1) "bicycle:5"
      2) "bicycle:6"
      3) "bicycle:8"
      4) "bicycle:7"
RATE THIS PAGE
Back to top ↑