def post(json_request_body: dict,
replica: str,
per_page: int,
output_format: str,
_scroll_id: typing.Optional[str] = None) -> dict:
es_query = json_request_body['es_query']
per_page = PerPageBounds.check(per_page)
replica_enum = Replica[replica] if replica is not None else Replica.aws
get_logger().debug("Received posted query. Replica: %s Query: %s Per_page: %i Timeout: %s Scroll_id: %s",
replica_enum.name, json.dumps(es_query, indent=4), per_page, _scroll_id)
# TODO: (tsmith12) determine if a search operation timeout limit is needed
# TODO: (tsmith12) allow users to retrieve previous search results
# TODO: (tsmith12) if page returns 0 hits, then all results have been found. delete search id
try:
page = _es_search_page(es_query, replica_enum, per_page, _scroll_id, output_format)
request_dict = _format_request_body(page, es_query, replica_enum, output_format)
request_body = jsonify(request_dict)
if len(request_dict['results']) < per_page:
response = make_response(request_body, requests.codes.ok)
else:
response = make_response(request_body, requests.codes.partial)
next_url = _build_scroll_url(page['_scroll_id'], per_page, replica_enum, output_format)
response.headers['Link'] = _build_link_header({next_url: {"rel": "next"}})
return response
except TransportError as ex:
if ex.status_code == requests.codes.bad_request:
get_logger().debug("%s", f"Invalid Query Recieved. Exception: {ex}")
raise DSSException(requests.codes.bad_request,
"elasticsearch_bad_request",
f"Invalid Elasticsearch query was received: {str(ex)}")
elif ex.status_code == requests.codes.not_found:
get_logger().debug("%s", f"Search Context Error. Exception: {ex}")
raise DSSException(requests.codes.not_found,
"elasticsearch_context_not_found",
"Elasticsearch context has returned all results or timeout has expired.")
elif ex.status_code == 'N/A':
get_logger().error("%s", f"Elasticsearch Invalid Endpoint. Exception: {ex}")
raise DSSException(requests.codes.service_unavailable,
"service_unavailable",
"Elasticsearch reached an invalid endpoint. Try again later.")
else:
get_logger().error("%s", f"Elasticsearch Internal Server Error. Exception: {ex}")
raise DSSException(requests.codes.internal_server_error,
"internal_server_error",
"Elasticsearch Internal Server Error")
except ElasticsearchException as ex:
get_logger().error("%s", f"Elasticsearch Internal Server Error. Exception: {ex}")
raise DSSException(requests.codes.internal_server_error,
"internal_server_error",
"Elasticsearch Internal Server Error")
评论列表
文章目录