'Takes a query to search on and returns dictionary.
The query should be a string that is appropriate syntax for the backend.
The returned dictionary should contain the keys \'results\' and \'hits\'.
The \'results\' value should be an iterable of populated SearchResult
objects. The \'hits\' should be an integer count of the number of matched
results the search backend found.
This method MUST be implemented by each backend, as it will be highly
specific to each one.'

@log_query
def search(self, query_string, **kwargs):

    raise NotImplementedError
