我正在探索 RediSearch,我想我应该尝试一下聚合功能,但遇到了障碍。
我似乎无法得到一个好的结果。
出于测试目的,我创建了一个基本的索引/模式,如下所示:
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
Run Code Online (Sandbox Code Playgroud)
接下来,我发出了以下查询:
FT.AGGREGATE test "*" GROUPBY 1 @field REDUCE COUNT 0 AS agg
Run Code Online (Sandbox Code Playgroud)
我的期望是我得到的结果表明hello发生了三次并world发生了一次......但我得到了以下结果:
1) (integer) 1
2) 1) "field"
2) (nil)
3) "agg"
4) "4"
Run Code Online (Sandbox Code Playgroud)
我认为这很直接……但我显然做错了什么。
此外,以下是MODULE LIST命令的输出:
1) 1) "name"
2) "ft"
3) "ver"
4) (integer) 10300
2) 1) "name"
2) "ReJSON"
3) "ver"
4) (integer) 10001
Run Code Online (Sandbox Code Playgroud)
任何帮助都会是超级的。
谢谢!
事实证明,我应该更好地阅读文档。
从聚合文档中的部分,他们描述了FT.AGGREGATE他们提到的命令参数LOAD {nargs} {property},他们说:
从文档 HASH 对象加载文档字段。作为一般经验法则,应该避免这种情况。聚合所需的字段应存储为SORTABLE,它们可用于聚合管道且延迟非常低。LOAD极大地损害了聚合查询的性能,因为每个处理过的记录都需要对 redis 键执行等效的 HMGET,当在数百万个键上执行时,处理时间非常长。
从原始问题中的查询示例中,我有:
FT.AGGREGATE test "*" GROUPBY 1 @field REDUCE COUNT 0 AS agg
由于模式定义没有field定义,因为SORTABLE我必须LOAD“字段”才能对其执行聚合。
FT.AGGREGATE test "*" LOAD 1 @field GROUPBY 1 @field REDUCE COUNT 0 AS agg
但是,由于根据文档LOAD会损害性能,因此我应该将要聚合的字段定义为SORTABLE.
FT.CREATE test SCHEMA field TEXT SORTABLE
正确定义模式后,我的原始查询就可以工作了。