从 FT.AGGREGATE 反馈或保存查询

问题描述 投票:0回答:1

我正在尝试在 rediSearch 中复制以下 SQL 查询:

%%sql
SELECT NumQuestions, COUNT(OwnerUserId) AS NumUsers
FROM (
    SELECT OwnerUserId, COUNT(*) AS NumQuestions
    FROM Posts
    WHERE PostTypeId = 1
    GROUP BY OwnerUserId
) AS PreguntasPorUsuario
GROUP BY NumQuestions
ORDER BY NumQuestions
LIMIT 34;

我已成功复制内部 SELECT,如下所示:

%%bash
redis-cli FT.AGGREGATE postsIndex \
  "@PostTypeId:[1 1]" \
  GROUPBY 1 @OwnerUserId \
  REDUCE COUNT 0 AS NumPreguntas

问题是当我尝试像在 SQL 中那样将 COUNT 应用于 OwnerUserId 时。我无法应用它。

我尝试存储 rediSearch 查询中的信息以在另一个查询中使用它,但我也无法做到这一点。

如果需要更多背景信息或信息,我很乐意提供。我正在使用 Google Collab 和 redis-cli

database csv redis nosql google-colaboratory
1个回答
0
投票

RediSearch 的

COUNT
减速器不带任何参数。在 SQL 中,为
COUNT
提供参数会从行计数中删除缺少该字段值的行。 使用 RediSearch,您只需要过滤掉缺少给定字段值的行。

FT.AGGREGATE postsIndex "@PostTypeId:[1 1]" 
                        GROUPBY 1 @OwnerUserId REDUCE COUNT 0 AS NumQuestions
                        FILTER "exists(@OwnerUserId)"
                        GROUPBY 1 @NumQuestions REDUCE COUNT 0 AS NumUsers
                        SORTBY 1 @NumQuestions MAX 34

在您的情况下,您按组值进行过滤,因此除非您期望一组

NULL
,否则您也可以删除过滤步骤,因为任何其他行无论如何都会通过它。

我认为您可能正在寻找的是

COUNT_DISTINCT
。在 RediSearch 查询语言中,
COUNT
减速器计算每个组下的行数,而
COUNT_DISTINCT
(和
COUNT_DISTINCTISH
)计算特定字段中唯一值的数量。

如果这就是您想要查询的内容,请尝试:

FT.AGGREGATE postsIndex "@PostTypeId:[1 1]" 
                        GROUPBY 1 @OwnerUserId REDUCE COUNT 0 AS NumQuestions
                        GROUPBY 1 @NumQuestions 
                                  REDUCE COUNT_DISTINCT 1 @OwnerUserId AS NumUsers
                        SORTBY 1 @NumQuestions MAX 34

我希望这能回答您的问题。查看聚合文档以获取更多信息以及过滤和减少的示例

© www.soinside.com 2019 - 2024. All rights reserved.