'Make a call to CloudSearch
:type query: :class:`boto.cloudsearch2.search.Query`
:param query: A group of search criteria
:rtype: :class:`boto.cloudsearch2.search.SearchResults`
:return: search results'

def __call__(self, query):

    api_version = '2013-01-01'
    if (self.domain and self.domain.layer1):
        api_version = self.domain.layer1.APIVersion
    if self.sign_request:
        data = self._search_with_auth(query.to_domain_connection_params())
    else:
        r = self._search_without_auth(query.to_params(), api_version)
        _body = r['body']
        _status_code = r['status_code']
        try:
            data = json.loads(_body)
        except ValueError:
            if (_status_code == 403):
                msg = ''
                import re
                g = re.search('<html><body><h1>403    Forbidden</h1>([^<]+)<', _body)
                try:
                    msg = (':    %s' % g.groups()[0].strip())
                except AttributeError:
                    pass
                raise SearchServiceException(('Authentication    error    from    Amazon%s' % msg))
            raise SearchServiceException(('Got    non-json    response    from    Amazon.    %s' % _body), query)
    if (('messages' in data) and ('error' in data)):
        for m in data['messages']:
            if (m['severity'] == 'fatal'):
                raise SearchServiceException(('Error    processing    search    %s    =>    %s' % (params, m['message'])), query)
    elif ('error' in data):
        raise SearchServiceException(('Unknown    error    processing    search    %s' % json.dumps(data)), query)
    data['query'] = query
    data['search_service'] = self
    return SearchResults(**data)
