It's the default behavior of HTML forms with GET method. You will need to build that URL yourself.
Backend way
- Drawback: It makes two requests to the server instead of one
- Advantage: It's more maintainable because the URL is built using the routing service 
Your routing file
_search:
    pattern: /page/{category}/{keyword}
    defaults: { _controller: Bundle:Default:page, category: 9, keyword: null }
_search_endpoint:
    pattern: /page
    defaults: { _controller: Bundle:Default:redirect }
Your controller
public function redirectAction()
{
    $category = $this->get('request')->query->get('category');
    $keyword = $this->get('request')->query->get('keyword');
    // You probably want to add some extra check here and there
    // do avoid any kind of side effects or bugs.
    $url = $this->generateUrl('_search', array(
        'category' => $category,
        'keyword'  => $keyword,
    ));
    return $this->redirect($url);
}
Frontend way
Using Javascript, you can build the URL yourself and redirect the user afterwards.
- Drawback: You don't have access to the routing service (although you could use the FOSJsRoutingBundle bundle)
- Advantage: You save one request
Note: You will need to get your own query string getter you can find a Stackoverflow thread here, below I'll use getQueryString on the jQuery object.
(function (window, $) {
    $('#theFormId').submit(function (event) {
        var category, keyword;
        event.preventDefault();
        // You will want to put some tests here to make
        // sure the code behaves the way you are expecting
        category = $.getQueryString('category');
        keyword = $.getQueryString('keyword');
        window.location.href = '/page/' + category + '/' + keyword;
    }):
})(window, jQuery);