Возникли проблемы с работой агрегатов.

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

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

Из раздела в документации агрегации, где они описывают 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

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

Другие вопросы по тегам