Amazon Elasticsearch Service
开发人员指南 (API 版本 2015-01-01)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

在 Amazon Elasticsearch Service 中为数据建立索引简介

由于 Elasticsearch 使用的是 REST API,因此可通过多种方法为文档编制索引。您可以使用标准客户端 (如 curl) 或可发送 HTTP 请求的任何编程语言。为了进一步简化与之交互的过程,Elasticsearch 拥有了适用于多种编程语言的客户端。高级用户可以直接跳至签署对 Amazon Elasticsearch Service 的 HTTP 请求

对于新数据以递增方式到达的情况 (例如,来自小型企业的客户订单),您可使用 _index API 在文档到达时为其建立索引。对于数据流频率较低的情况 (例如,市场营销网站的每周更新),您可能更愿意生成一个文件并将该文件发送到 _bulk API。对于大量文档,将请求集中在一起并使用 _bulk API 可实现卓越性能。但是,如果您有很多文档,您可能需要使用 _index API 为这些文档建立索引。

有关从其他 AWS 服务集成数据的信息,请参阅将流数据加载到 Amazon Elasticsearch Service

建立索引的简介

您必须先为数据编制索引,然后才能搜索数据。建立索引是搜索引擎整理数据以实现快速检索的方法。生成的结构被称为“索引”。

在 Elasticsearch 中,数据的基本单位是 JSON 文档。在索引中,Elasticsearch 将文档整理为类型(您定义的任意数据类型)并使用唯一 ID 标识它们。

_index API 的请求如下所示:

PUT elasticsearch_domain/index/type/id { "A JSON": "document" }

由于您在批量数据中指定索引、类型和 ID,因此,对 _bulk API 的请求看起来会略为不同:

POST elasticsearch_domain/_bulk { "index": { "_index" : "index", "_type" : "type", "_id" : "id" } } { "A JSON": "document" }

批量数据必须符合特定格式,即每行末尾处 (包括最后一行) 有一个换行符 (\n)。这是基本格式:

action_and_metadata\n optional_document\n action_and_metadata\n optional_document\n ...

有关简短示例文件,请参阅步骤 2:将数据上传到 Amazon ES 域以便编制索引

在您将文档添加到不存在的索引时,Elasticsearch 会采用自动索引创建。如果未在请求中指定 ID,它还会自动生成 ID。此简单示例会自动创建 movies 索引、建立 movie 文档类型、为文档建立索引并向文档分配唯一 ID:

POST elasticsearch_domain/movies/movie {"title": "Spirited Away"}

重要

要使用自动 ID 生成,您必须使用 POST 方法而不是 PUT

要验证文档是否存在,您可以执行以下搜索:

GET elasticsearch_domain/movies/_search?pretty

该响应应包含以下内容:

"hits" : { "total" : 1,   "max_score" : 1.0,   "hits" : [   {     "_index" : "movies",       "_type" : "movie",       "_id" : "AV4WaTnYxBoJaZkSFeX9",       "_score" : 1.0,       "_source" : {         "title" : "Spirited Away"       }     }   ] }

自动生成 ID 有一个明显的缺点:由于索引代码未指定文档 ID,以后无法轻松更新文档。要指定 7 的 ID,请使用以下请求:

PUT elasticsearch_domain/movies/movie/7 {"title": "Spirited Away"}

您在 Elasticsearch 版本 6.0 及更高版本中创建的索引只能包含一种文档类型。为了获得与未来版本的 Elasticsearch 的最佳兼容性,请对所有索引使用单个类型 _doc

PUT elasticsearch_domain/more-movies/_doc/1 {"title": "Back to the Future"}

索引默认为 5 个主分片和 1 个副本。如果您要指定非默认设置,请在添加文档之前创建索引:

PUT elasticsearch_domain/more-movies {"settings": {"number_of_shards": 6, "number_of_replicas": 2}}

注意

有关示例代码,请参阅 签署对 Amazon Elasticsearch Service 的 HTTP 请求

索引的命名限制

Elasticsearch 索引具有以下命名限制:

  • 所有字母必须为小写形式。

  • 索引名称不能以 _- 开头。

  • 索引名称不能包含空格、逗号、"*+/\|?#><

请勿在索引、类型或文档 ID 名称中包含敏感信息。Elasticsearch 会在其统一资源标识符 (URI) 中使用这些名称。服务器和应用程序通常会记录 HTTP 请求,从而会在 URI 包含敏感信息的情况下可能会导致不必要的数据泄露:

2018-10-03T23:39:43 198.51.100.14 200 "GET https://elasticsearch_domain/dr-jane-doe/flu-patients-2018/202-555-0100/ HTTP/1.1"

即使您没有查看关联的 JSON 文档的权限,您也能够从“ Doe 医生的其中一位电话号码为 202-555-0100 的患者在 2018 年患过流感”这一伪造日志行中推断出来。

减小响应大小

来自 _index_bulk API 的响应包含相当多的信息。此信息可用于对请求进行问题排查或实施重试逻辑,但可使用大量带宽。在本示例中,对 32 字节文档编制索引会生成 339 字节响应(包括标头):

PUT elasticsearch_domain/more-movies/_doc/1 {"title": "Back to the Future"}

响应

{ "_index": "more-movies", "_type": "_doc", "_id": "1", "_version": 4, "result": "updated", "_shards": { "total": 2, "successful": 2, "failed": 0 }, "_seq_no": 3, "_primary_term": 1 }

此响应大小可能看起来很小,但如果您每天对 1000000 个文档(每秒对大约 11.5 个文档)编制索引,则每个响应 339 字节总计为每月 10.17GB 的下载流量。

如果数据传输成本很重要,请使用 filter_path 参数来减小 Elasticsearch 响应的大小,但请小心,不要筛掉标识或重试失败请求所需的字段。这些字段会因客户端而异。filter_path 参数适用于所有 Elasticsearch REST API,但尤其适用于您经常调用的 API,例如 _index_bulk API:

PUT elasticsearch_domain/more-movies/_doc/1?filter_path=result,_shards.total {"title": "Back to the Future"}

响应

{ "result": "updated", "_shards": { "total": 2 } }

不同于包括字段,您可以使用 - 前缀排除字段。filter_path 还支持通配符:

POST elasticsearch_domain/_bulk?filter_path=-took,-items.index._* { "index": { "_index": "more-movies", "_type": "_doc", "_id": "1" } } {"title": "Back to the Future"} { "index": { "_index": "more-movies", "_type": "_doc", "_id": "2" } } {"title": "Spirited Away"}

响应

{ "errors": false, "items": [ { "index": { "result": "updated", "status": 200 } }, { "index": { "result": "updated", "status": 200 } } ] }