prefix(['user:']); $schema = [ new TextField('name'), new TextField('country'), new NumericField('dob', '', AbstractField::SORTABLE), ]; $client->ftcreate('index_cursor_read', $schema, $ftCreateArguments); // 2. Add documents $client->hset('user:0', 'name', 'Vlad', 'country', 'Ukraine', 'dob', 813801600); $client->hset('user:1', 'name', 'Vlad', 'country', 'Israel', 'dob', 782265600); $client->hset('user:2', 'name', 'Vlad', 'country', 'Ukraine', 'dob', 813801600); // 3. Execute aggregation query $ftAggregateArguments = (new AggregateArguments()) ->apply('year(@dob)', 'birth') ->groupBy('@country', '@birth') ->reduce('COUNT', true, 'country_birth_Vlad_count') ->sortBy(0, '@birth', 'DESC') ->withCursor(1); [$response, $cursor] = $client->ftaggregate('index_cursor_read', '@name: "Vlad"', $ftAggregateArguments); // 4. Processing response in loop until cursorId exists $actualResponse = []; $cursors = []; while ($cursor) { $actualResponse[] = $response[1]; $cursors[] = $cursor; [$response, $cursor] = $client->ftcursor->read('index_cursor_read', $cursor); } echo "Response: \n"; print_r($actualResponse);