public static function map($query = [], callable $callback = null, $limit = -1)
    {
        if ($query instanceof QueryBuilder) {
            $query = $query->build();
        }

        $query['from'] = Arr::get($query, 'from', 0);
        $query['size'] = Arr::get($query, 'size', 50);

        $i = 0;
        $models = static::search($query);
        $total = $models->getTotal();
        while ($models) {
            foreach ($models as $model) {
                if ($callback) {
                    $callback($model);
                }
                $i++;
            }

            $query['from'] += $query['size'];

            if ($i >= $total || ($limit > 0 && $i >= $limit)) {
                break;
            }

            $models = static::search($query);
        }

        return $total;
    }