无法使聚合正常工作。
Having trouble getting aggregations working.
我正在探索 RediSearch,我想我应该试试聚合功能,但遇到了障碍。
我好像得不到好结果。
出于测试目的,我创建了一个基本的 index/schema,如下所示:
FT.CREATE test SCHEMA field TEXT
FT.ADD test 1A 1 FIELDS field hello
FT.ADD test 2A 1 FIELDS field hello
FT.ADD test 3A 1 FIELDS field hello
FT.ADD test 4A 1 FIELDS field world
接下来,我发出了以下查询:
FT.AGGREGATE test "*" GROUPBY 1 @field REDUCE COUNT 0 AS agg
我的期望是我得到的结果表明 hello
出现了三次,而 world
出现了一次......但是我得到了以下结果:
1) (integer) 1
2) 1) "field"
2) (nil)
3) "agg"
4) "4"
我认为这很简单...但我显然做错了什么。
此外,以下是 MODULE LIST
命令的输出:
1) 1) "name"
2) "ft"
3) "ver"
4) (integer) 10300
2) 1) "name"
2) "ReJSON"
3) "ver"
4) (integer) 10001
任何帮助都会很棒。
谢谢!
事实证明,我应该更好地阅读文档。
在 aggregations documentation 中他们描述 FT.AGGREGATE
命令参数的部分提到 LOAD {nargs} {property}
,他们说:
Load document fields from the document HASH objects. This should be
avoided as a general rule of thumb. Fields needed for aggregations
should be stored as SORTABLE, where they are available to the
aggregation pipeline with very low latency. LOAD hurts the performance
of aggregate queries considerably since every processed record needs
to execute the equivalent of HMGET against a redis key, which when
executed over millions of keys, amounts to very high processing times.
从我原来的问题中的查询示例:
FT.AGGREGATE test "*" GROUPBY 1 @field REDUCE COUNT 0 AS agg
由于模式定义没有将 field
定义为 SORTABLE
,因此我必须 LOAD
"field" 才能对其执行聚合。
FT.AGGREGATE test "*" LOAD 1 @field GROUPBY 1 @field REDUCE COUNT 0 AS agg
但是,根据文档,LOAD
会影响性能,因此我应该将要聚合的字段定义为 SORTABLE
。
FT.CREATE test SCHEMA field TEXT SORTABLE
在正确定义模式的情况下,我的原始查询有效。
我正在探索 RediSearch,我想我应该试试聚合功能,但遇到了障碍。
我好像得不到好结果。
出于测试目的,我创建了一个基本的 index/schema,如下所示:
FT.CREATE test SCHEMA field TEXT
FT.ADD test 1A 1 FIELDS field hello
FT.ADD test 2A 1 FIELDS field hello
FT.ADD test 3A 1 FIELDS field hello
FT.ADD test 4A 1 FIELDS field world
接下来,我发出了以下查询:
FT.AGGREGATE test "*" GROUPBY 1 @field REDUCE COUNT 0 AS agg
我的期望是我得到的结果表明 hello
出现了三次,而 world
出现了一次......但是我得到了以下结果:
1) (integer) 1
2) 1) "field"
2) (nil)
3) "agg"
4) "4"
我认为这很简单...但我显然做错了什么。
此外,以下是 MODULE LIST
命令的输出:
1) 1) "name"
2) "ft"
3) "ver"
4) (integer) 10300
2) 1) "name"
2) "ReJSON"
3) "ver"
4) (integer) 10001
任何帮助都会很棒。
谢谢!
事实证明,我应该更好地阅读文档。
在 aggregations documentation 中他们描述 FT.AGGREGATE
命令参数的部分提到 LOAD {nargs} {property}
,他们说:
Load document fields from the document HASH objects. This should be avoided as a general rule of thumb. Fields needed for aggregations should be stored as SORTABLE, where they are available to the aggregation pipeline with very low latency. LOAD hurts the performance of aggregate queries considerably since every processed record needs to execute the equivalent of HMGET against a redis key, which when executed over millions of keys, amounts to very high processing times.
从我原来的问题中的查询示例:
FT.AGGREGATE test "*" GROUPBY 1 @field REDUCE COUNT 0 AS agg
由于模式定义没有将 field
定义为 SORTABLE
,因此我必须 LOAD
"field" 才能对其执行聚合。
FT.AGGREGATE test "*" LOAD 1 @field GROUPBY 1 @field REDUCE COUNT 0 AS agg
但是,根据文档,LOAD
会影响性能,因此我应该将要聚合的字段定义为 SORTABLE
。
FT.CREATE test SCHEMA field TEXT SORTABLE
在正确定义模式的情况下,我的原始查询有效。