聚合查询

分组和聚合查询结果

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

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

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

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

字段名称 字段类型
condition 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

以下示例向您展示如何计算新自行车的折扣价格:

字段 __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。输出是按价格类别分组的可负担自行车数量。

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

结果是:

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

不进行聚合的分组

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

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

此查询的输出是:

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