英尺。骨料

语法
FT.AGGREGATE index query 
  [VERBATIM] 
  [LOAD count field [field ...]] 
  [TIMEOUT timeout] 
  [ GROUPBY nargs property [property ...] [ REDUCE function nargs arg [arg ...] [AS name] [ REDUCE function nargs arg [arg ...] [AS name] ...]] ...]] 
  [ SORTBY nargs [ property ASC | DESC [ property ASC | DESC ...]] [MAX num] [WITHCOUNT] 
  [ APPLY expression AS name [ APPLY expression AS name ...]] 
  [ LIMIT offset num] 
  [FILTER filter] 
  [ WITHCURSOR [COUNT read_size] [MAXIDLE idle_time]] 
  [ PARAMS nargs name value [ name value ...]] 
  [SCORER scorer]
  [ADDSCORES] 
  [DIALECT dialect]
可用:
Redis 堆栈 / 搜索 1.1.0
时间复杂度:
O(1)

对索引运行搜索查询,并对结果执行聚合转换,从中提取统计信息等

例子

必需参数

index

是执行查询所依据的索引名称。您必须首先使用FT.CREATE.

query

是检索文档的基本筛选查询。它遵循与搜索查询完全相同的语法,包括 filters、unions、not、optional 等。

可选参数

VERBATIM

如果设置,则不尝试使用词干提取进行查询扩展,而是逐字搜索查询词。

LOAD {nargs} {identifier} AS {property} …

从源文档加载文档属性。

  • identifier是哈希和 JSON 的属性名称,或者是 JSON 的 JSON 路径表达式。
  • property是结果中使用的可选名称。如果未提供,则identifier被使用。应避免这种情况。
  • 如果用作*nargs,则加载文档中的所有属性。

聚合所需的属性应存储为SORTABLE,其中它们可用于聚合管道,延迟非常低。LOAD会严重损害聚合查询的性能,因为每个已处理的记录都需要执行等效的HMGET针对 Redis 键,当在数百万个键上执行时,相当于较长的处理时间。

GROUPBY {nargs} {property}

根据一个或多个属性对管道中的结果进行分组。每个 group 都应该至少有一个 reducer,一个处理 group 条目的函数, 对它们进行计数,或执行多个聚合作(见下文)。

REDUCE {func} {nargs} {arg} … [AS {name}]

使用 Reduction 函数将每个组中的匹配结果减少到单个记录中。例如COUNT对组中的记录数进行计数。reducer 可以使用AS {name}optional 参数。如果未给出 name,则结果名称将是 reduce 函数的名称和 group 属性。例如,如果未为COUNT_DISTINCT按属性@foo,则结果名称将为count_distinct(@foo).

有关更多详细信息,请参阅支持的 GROUPBY Reducer

SORTBY {nargs} {property} {ASC|DESC} [MAX {num}]

对管道进行排序,直到SORTBY,使用属性列表。

  • 默认情况下,排序是升序的,但ASCDESC 可以为每个属性添加。
  • nargs是排序参数的数量,包括ASCDESC例如SORTBY 4 @foo ASC @bar DESC.
  • MAX用于优化排序,通过仅对 n 个最大的元素进行排序。虽然它没有连接到LIMIT,您通常只需要SORTBY … MAX的常见查询。

所需的属性SORTBY应存储为SORTABLE以非常低的延迟提供。

排序优化:针对以下排序作优化性能DIALECT 4在不同场景下:

  • Skip Sorter - 在没有任何类型的情况下应用。查询可以在到达LIMIT请求的结果。
  • 部分范围 - 当存在SORTBY子句,如果没有 filter 或按同一 numeric 字段进行筛选,则查询将迭代足够大的范围以满足LIMIT请求的结果。
  • Hybrid - 在存在SORTBY子句和另一个非数字筛选器。某些结果将被筛选,并且初始范围可能不够大。然后,迭代器使用以下范围倒带,并进行额外的迭代以收集LIMIT请求的结果。
  • 无优化 - 如果存在按分数或按非数字字段排序,则除了检索所有结果并比较其值外,别无选择。

计数行为:可选WITHCOUNTargument 返回查询结果的准确计数和排序。此作处理所有结果以获得准确的计数,其性能低于 optimized 选项(默认行为为DIALECT 4)

APPLY {expr} AS {name}

对一个或多个属性应用 1 对 1 转换,并将结果存储为管道中的新属性,或使用此属性替换任何属性 转型。

expr是一个表达式,可用于对数值属性执行算术运算,或者可以根据属性的类型(见下文)应用于属性的函数,或者它们的任意组合。例如APPLY "sqrt(@foo)/log(@bar) + 5" AS baz为管道中的每条记录动态计算此表达式,并将结果存储为名为baz,可进一步引用APPLY/SORTBY/GROUPBY/REDUCE作 管道。

有关详细信息,请参阅 APPLY 表达式

LIMIT {offset} {num}

限制仅返回的结果数量num结果从 index 开始offset(从零开始)。使用起来效率要高得多SORTBY … MAX如果你 只对限制排序作的输出感兴趣。 如果密钥在查询期间过期,则尝试对load键的值将返回一个 null 数组。

但是,limit 可用于限制不排序的结果,或用于分页 n 个最大结果,由SORTBY MAX.例如,获得前 100 个结果中的 50-100 个结果最有效地表示为SORTBY 1 @foo MAX 100 LIMIT 50 50.删除MAXSORTBY结果在管道中对所有记录进行排序,然后对结果 50-100 进行分页。

FILTER {expr}

使用与每个结果中的值相关的谓词表达式筛选结果。 它们在查询后应用,并与管道的当前状态相关。

WITHCURSOR {COUNT} {read_size} [MAXIDLE {idle_time}]

使用比LIMIT. 有关更多详细信息,请参阅 Cursor API

TIMEOUT {milliseconds}

如果设置,则覆盖模块的 timeout 参数。

PARAMS {nargs} {name} {value}

定义一个或多个值参数。每个参数都有一个名称和一个值。

您可以在query通过 a ,后跟参数名称,例如$$user.搜索查询中对参数名称的每个此类引用都由相应的参数值替换。例如,使用参数定义PARAMS 4 lon 29.69465 lat 34.95126、表达式@loc:[$lon $lat 10 km]的计算结果为@loc:[29.69465 34.95126 10 km].您不能在不允许使用具体值的查询字符串中引用参数,例如在字段名称中,例如@loc.要使用PARAMS设置DIALECT2或大于2.

SCORER {scorer}

使用内置用户提供的评分函数。

ADDSCORES

ADDSCORESoption 向聚合管道公开全文分数值。 您可以使用@__score在管道中,如以下示例所示:

FT.AGGREGATE idx 'hello' ADDSCORES SORTBY 2 @__score DESC

DIALECT {dialect_version}

选择要在其下执行查询的 dialect 版本。如果未指定,查询将在模块初始加载期间设置的默认方言版本下执行,或通过FT.CONFIG SET命令。

返回

英尺。AGGREGATE 返回数组回复,其中每行都是数组回复,表示单个聚合结果。 位置处的整数回复1不表示有效值。

返回多个值

请参阅FT.SEARCHDIALECT可以作为 FT 中的参数指定。AGGREGATE 命令。如果未指定,则DEFAULT_DIALECT,可以使用FT.CONFIG SET或者将其作为参数传递给redisearch模块。 例如,使用以下 document 和 index:

127.0.0.1:6379> JSON.SET doc:1 $ '[{"arr": [1, 2, 3]}, {"val": "hello"}, {"val": "world"}]'
OK
127.0.0.1:6379> FT.CREATE idx ON JSON PREFIX 1 doc: SCHEMA $..arr AS arr NUMERIC $..val AS val TEXT
OK

Notice the different replies, with and without DIALECT 3:

127.0.0.1:6379> FT.AGGREGATE idx * LOAD 2 arr val 
1) (integer) 1
2) 1) "arr"
   2) "[1,2,3]"
   3) "val"
   4) "hello"

127.0.0.1:6379> FT.AGGREGATE idx * LOAD 2 arr val DIALECT 3
1) (integer) 1
2) 1) "arr"
   2) "[[1,2,3]]"
   3) "val"
   4) "[\"hello\",\"world\"]"

Complexity

Non-deterministic. Depends on the query and aggregations performed, but it is usually linear to the number of results returned.

Examples

Sort page visits by day

Find visits to the page about.html, group them by the day of the visit, count the number of visits, and sort them by day.

FT.AGGREGATE idx "@url:\"about.html\""
    APPLY "day(@timestamp)" AS day
    GROUPBY 2 @day @country
      REDUCE count 0 AS num_visits
    SORTBY 4 @day
Find most books ever published

Find most books ever published in a single year.

FT.AGGREGATE books-idx *
    GROUPBY 1 @published_year
      REDUCE COUNT 0 AS num_published
    GROUPBY 0
      REDUCE MAX 1 @num_published AS max_books_published_per_year
Reduce all results

The last example used GROUPBY 0. Use GROUPBY 0 to apply a REDUCE function over all results from the last step of an aggregation pipeline -- this works on both the initial query and subsequent GROUPBY operations.

Search for libraries within 10 kilometers of the longitude -73.982254 and latitude 40.753181 then annotate them with the distance between their location and those coordinates.

 FT.AGGREGATE libraries-idx "@location:[-73.982254 40.753181 10 km]"
    LOAD 1 @location
    APPLY "geodistance(@location, -73.982254, 40.753181)"

Here, notice the required use of LOAD to pre-load the @location attribute because it is a GEO attribute.

Next, count GitHub events by user (actor), to produce the most active users.

127.0.0.1:6379> FT.AGGREGATE gh "*" GROUPBY 1 @actor REDUCE COUNT 0 AS num SORTBY 2 @num DESC MAX 10
 1) (integer) 284784
 2) 1) "actor"
    2) "lombiqbot"
    3) "num"
    4) "22197"
 3) 1) "actor"
    2) "codepipeline-test"
    3) "num"
    4) "17746"
 4) 1) "actor"
    2) "direwolf-github"
    3) "num"
    4) "10683"
 5) 1) "actor"
    2) "ogate"
    3) "num"
    4) "6449"
 6) 1) "actor"
    2) "openlocalizationtest"
    3) "num"
    4) "4759"
 7) 1) "actor"
    2) "digimatic"
    3) "num"
    4) "3809"
 8) 1) "actor"
    2) "gugod"
    3) "num"
    4) "3512"
 9) 1) "actor"
    2) "xdzou"
    3) "num"
    4) "3216"
[10](10)) 1) "actor"
    2) "opstest"
    3) "num"
    4) "2863"
11) 1) "actor"
    2) "jikker"
    3) "num"
    4) "2794"
(0.59s)

See also

FT.CONFIG SET | FT.SEARCH


RATE THIS PAGE
Back to top ↑