def query(self, query, filters=None, columns=None, sort=None, start=0, rows=30):
        if not columns:
            columns = ["*", "score"]
        fields = {"q": query,
                 "json.nl" :"map",
                 "fl": ",".join(columns),
                 "start": str(start),
                 "rows": str(rows),
                 "wt": "json"}
        if len(self.endpoints) > 1:
            fields["shards"] = self._get_shards()
        if not filters is None:
            filter_list = []
            for filter_field, value in filters.items():
                filter_list.append("%s:%s" % (filter_field, value))
            fields["fq"] = " AND ".join(filter_list)
        if not sort is None:
            fields["sort"] = ",".join(sort)
        assert self.default_endpoint in self.endpoints
        request_url = _get_url(self.endpoints[self.default_endpoint], "select")
        results = self._send_solr_query(request_url, fields)
        if not results:
            return None
        assert "responseHeader" in results
        if not results.get("responseHeader").get("status") == 0:
            logger.error("Server error while retrieving results: %s", results)
            return None
        assert "response" in results
        result_obj = self._parse_response(results)
        return result_obj