Возникли проблемы с работой агрегатов.
Я нахожусь в процессе изучения 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
С правильно определенной схемой работает мой оригинальный запрос.