英尺。骨料
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]
对索引运行搜索查询,并对结果执行聚合转换,从中提取统计信息等
必需参数
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
,使用属性列表。
- 默认情况下,排序是升序的,但
ASC
或DESC
可以为每个属性添加。 nargs
是排序参数的数量,包括ASC
和DESC
例如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
请求的结果。 - 无优化 - 如果存在按分数或按非数字字段排序,则除了检索所有结果并比较其值外,别无选择。
计数行为:可选WITHCOUNT
argument 返回查询结果的准确计数和排序。此作处理所有结果以获得准确的计数,其性能低于 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
.删除MAX
从SORTBY
结果在管道中对所有记录进行排序,然后对结果 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
设置DIALECT
自2
或大于2
.
ADDSCORES
这ADDSCORES
option 向聚合管道公开全文分数值。
您可以使用@__score
在管道中,如以下示例所示:
FT.AGGREGATE idx 'hello' ADDSCORES SORTBY 2 @__score DESC
DIALECT {dialect_version}
选择要在其下执行查询的 dialect 版本。如果未指定,查询将在模块初始加载期间设置的默认方言版本下执行,或通过FT.CONFIG SET
命令。
返回
英尺。AGGREGATE 返回数组回复,其中每行都是数组回复,表示单个聚合结果。
位置处的整数回复1
不表示有效值。
返回多个值
请参阅在FT.SEARCH
这DIALECT
可以作为 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
Related topics