在 Amazon Elasticsearch Service 中压缩 HTTP 请求 - Amazon Elasticsearch Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在 Amazon Elasticsearch Service 中压缩 HTTP 请求

您可以使用 gzip 压缩来压缩 Amazon Elasticsearch Service (Amazon ES) 域中的 HTTP 请求和响应。Gzip 压缩可帮助您缩小文档的大小,降低带宽利用率和延迟时间,从而提高传输速度。

所有运行 Elasticsearch 6.0 或更高版本的域都支持 Gzip 压缩。一些 Elasticsearch 客户端具有对 gzip 压缩的内置支持,许多编程语言都具有简化过程的库。

启用 gzip 压缩

不要与类似的 Elasticsearch 设置混淆,http_compression.enabled特定于亚马逊 ES,并在域上启用或禁用 gzip 压缩。运行弹性搜索的域 7.x默认情况下启用功能,而域运行 6。x默认情况下它是禁用的。

要启用 gzip 压缩,请发送以下请求:

PUT _cluster/settings { "persistent" : { "http_compression.enabled": true } }

请求_cluster/settings必须未压缩,因此您可能需要使用单独的客户端或标准 HTTP 请求来更新群集设置。

必需的标头

当包含 gzip 压缩的请求主体时,请保留标准的Content-Type: application/json标头,然后添加Content-Encoding: gzip标头。要接受 gzip 压缩的响应,请添加Accept-Encoding: gzip标头,以及。如果 Elasticsearch 客户端支持 gzip 压缩,它可能会自动包含这些标头。

Sample代码 (Python 3)

以下示例使用弹性搜索执行压缩并发送请求。此代码使用您的 IAM 证书对请求进行签名。

注意

最新版本的 Elasticsearch 客户端可能包括许可证或版本检查,这些检查会人为破坏兼容性。有关要使用的正确客户端版本,请参阅Elasticsearch 客户端兼容性.

from elasticsearch import Elasticsearch, RequestsHttpConnection from requests_aws4auth import AWS4Auth import boto3 host = '' # e.g. my-test-domain.us-east-1.es.amazonaws.com region = '' # e.g. us-west-1 service = 'es' credentials = boto3.Session().get_credentials() awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token) # Create the client. es = Elasticsearch( hosts = [{'host': host, 'port': 443}], http_auth = awsauth, use_ssl = True, verify_certs = True, http_compress = True, # enables gzip compression for request bodies connection_class = RequestsHttpConnection ) document = { "title": "Moneyball", "director": "Bennett Miller", "year": "2011" } # Send the request. print(es.index(index='movies', id='1', body=document, refresh=True)) # # Older versions of the client might require doc_type. # print(es.index(index='movies', doc_type='_doc', id='1', body=document, refresh=True))

或者,您可以指定正确的标头,自己压缩请求正文,并使用像请求. 此代码使用 HTTP 基本凭据对请求进行签名,如果您使用访问权限的精细控制.

import requests import gzip import json base_url = '' # The domain with https:// and a trailing slash. For example, https://my-test-domain.us-east-1.es.amazonaws.com/ auth = ('master-user', 'master-user-password') # For testing only. Don't store credentials in code. headers = {'Accept-Encoding': 'gzip', 'Content-Type': 'application/json', 'Content-Encoding': 'gzip'} document = { "title": "Moneyball", "director": "Bennett Miller", "year": "2011" } # Compress the document. compressed_document = gzip.compress(json.dumps(document).encode()) # Send the request. path = 'movies/_doc?refresh=true' url = base_url + path response = requests.post(url, auth=auth, headers=headers, data=compressed_document) print(response.status_code) print(response.text)