Возникли проблемы с работой агрегатов. - PullRequest
0 голосов
/ 31 октября 2018

Я нахожусь в процессе изучения 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

Далее я выдал следующий запрос:

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

Любая помощь будет супер.

Спасибо!

1 Ответ

0 голосов
/ 31 октября 2018

Оказывается, мне следовало бы лучше прочитать документацию.

Из раздела документации агрегации , где они описывают параметры команды FT.AGGREGATE, в которых они упоминают LOAD {nargs} {property}, где они говорят:

Загрузка полей документа из объектов HASH документа. Это должно быть избегать как общее правило. Поля, необходимые для агрегации должен храниться как SORTABLE , где они доступны для конвейер агрегации с очень низкой задержкой. LOAD ухудшает производительность значительно агрегированных запросов, так как каждая обработанная запись нуждается выполнить эквивалент HMGET против ключа Redis, который при выполняется на миллионах ключей, что приводит к очень высокому времени обработки.

Из примера запроса в исходном вопросе, который у меня был:

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

С правильно определенной схемой мой оригинальный запрос работает.

...