1. 将 HTTP 命令由 PUT
改为 GET
可以用来检索文档,同样的,可以使用 DELETE
命令来删除文档,以及使用 HEAD
指令来检查文档是否存在。如果想更新已存在的文档,只需再次 PUT
2. Elasticsearch 尽可能地屏蔽了分布式系统的复杂性,在后台自动执行的操作:
① 分配文档到不同的容器 或 分片 中,文档可以储存在一个或多个节点中
② 按集群节点来均衡分配这些分片,从而对索引和搜索过程进行负载均衡
③ 复制每个分片以支持数据冗余,从而防止硬件故障导致的数据丢失
④ 将集群中任一节点的请求路由到存有相关数据的节点
⑤ 集群扩容时无缝整合新节点,重新分配分片以便从离群节点恢复
3. 在 Elasticsearch 中,数据是被存储和索引在 分片 中,索引实际上是指向 一个或者 多个物理 分片 的 逻辑命名空间 ,一个 分片 是一个底层的 工作单元 ,它仅保存了全部数据中的一部分。
4. 一个分片可以是 主 分片或者 副本 分片。 索引内任意一个文档都归属于一个主分片,所以主分片的数目决定着索引能够保存的最大数据量。
5. 技术上来说,一个主分片最大能够存储 Integer.MAX_VALUE - 128 个文档,但是实际最大值还需要参考你的使用场景:包括你使用的硬件, 文档的大小和复杂程度,索引和查询文档的方式以及你期望的响应时长
6. 一个副本分片只是一个主分片的拷贝。副本分片作为硬件故障时保护数据不丢失的冗余备份,并为搜索和返回文档等读操作提供服务。
7. 集群的健康状况为 yellow
则表示全部 主 分片都正常运行(集群可以正常服务所有请求),但是 副本分片没有全部处在正常状态。
8. 字段的名字可以是任何合法的字符串,但 不可以 包含英文句号(.)。
9. _index: 选择一个索引名,这个名字必须小写,不能以下划线开头,不能包含逗号。
10. _type: 命名可以是大写或者小写,但是不能以下划线或者句号开头,不应该包含逗号, 并且长度限制为256个字符。
11. _id: ID 是一个字符串,当它和 _index
以及 _type
组合就可以唯一确定 Elasticsearch 中的一个文档。 当你创建一个新的文档,要么提供自己的 _id
,要么让 Elasticsearch 帮你生成。
12. 在请求的查询串参数中加上 pretty
参数,该功能使得JSON 响应体更加可读。
13. GET
请求的响应体包括 {"found": true}
,这证实了文档已经被找到。 如果我们请求一个不存在的文档,我们仍旧会得到一个 JSON 响应体,但是 found
将会是 false
。 此外, HTTP 响应码将会是 404 Not Found
,而不是 200 OK
。附官方释图:
14. 通过传递 -i
参数给 curl
命令,该参数能够显示响应的头部。附官方释图:
15. 返回文档的一部分:默认情况下, GET
请求会返回整个文档,这个文档正如存储在 _source
字段中的一样。但是也许你只对其中的 title
字段感兴趣。单个字段能用 _source
参数请求得到,多个字段也能使用逗号分隔的列表来指定。或者,如果你只想得到 _source
字段,不需要任何元数据。附官方释图:
16. 检查文档是否存在:用 HEAD
方法来代替 GET
方法。 HEAD
请求没有返回体,如果文档存在, Elasticsearch 将返回一个 200 ok
的状态码,若文档不存在, Elasticsearch 将返回一个 404 Not Found
的状态码。
17. 更新整个文档:在 Elasticsearch 中文档是 不可改变 的,不能修改它们。相反,如果想要更新现有的文档,需要 重建索引 或者进行替换, 可以使用相同的 index
API 进行实现,更新成功后,可以在响应体中看到,增加了 _version
字段值,created
标志设置成 false
,是因为相同的索引、类型和 ID 的文档已经存在。在内部,Elasticsearch 已将旧文档标记为已删除,并增加一个全新的文档。 尽管你不能再对旧版本的文档进行访问,但它并不会立即消失。当继续索引更多的数据,Elasticsearch 会在后台清理这些已删除文档。
18. 创建新文档:怎么确认我们正在创建一个完全新的文档
① 第一种方法使用 op_type
查询-字符串参数:
② 第二种方法是在 URL 末端使用 /_create
:
如果创建新文档的请求成功执行,Elasticsearch 会返回元数据和一个 201 Created
的 HTTP 响应码。
如果具有相同的 _index
、 _type
和 _id
的文档已经存在,Elasticsearch 将会返回 409 Conflict
响应码,及出错误信息。
19. 删除文档:使用 DELETE
方法删除文档
① 如果找到该文档,Elasticsearch 将要返回一个 200 ok
的 HTTP 响应码,和一个类似以下结构的响应体。注意,字段 _version
值已经增加:
② 如果文档没有找到,我们将得到 404 Not Found
的响应码和类似这样的响应体:
即使文档不存在( Found
是 false
), _version
值仍然会增加。这是 Elasticsearch 内部记录本的一部分,用来确保这些改变在跨多节点时以正确的顺序执行。
20. 取回多个文档:每个文档都是单独检索和报告的。即使有某个文档没有找到,上述请求的 HTTP 状态码仍然是 200
。事实上,即使请求 没有 找到任何文档,它的状态码依然是 200
--因为 mget
请求本身已经成功执行。 为了确定某个文档查找是成功或者失败,你需要检查 found
标记。
①
mget
API 要求有一个 docs
数组作为参数,每个元素包含需要检索文档的元数据, 包括 _index
、 _type
和 _id
。如果你想检索一个或者多个特定的字段,那么你可以通过 _source
参数来指定这些字段的名字:
② 该响应体也包含一个 docs
数组, 对于每一个在请求中指定的文档,这个数组中都包含有一个对应的响应,且顺序与请求中的顺序相同。 其中的每一个响应都和使用单个 get
request 请求所得到的响应体相同:
如果所有文档的 _index
和 _type
都是相同的,你可以只传一个 ids
数组,而不是整个 docs
数组:
21. shard = hash(routing) % number_of_primary_shards
routing
是一个可变值,默认是文档的 _id
,也可以设置成一个自定义的值。 routing
通过 hash 函数生成一个数字,然后这个数字再除以 number_of_primary_shards
(主分片的数量)后得到 余数 。这个分布在 0
到 number_of_primary_shards-1
之间的余数,就是我们所寻求的文档所在分片的位置
22. 要在创建索引的时候就确定好主分片的数量 并且永远不会改变这个数量:因为如果数量变化了,那么所有之前路由的值都会无效,文档也再也找不到了。
23. 主分片和副本分片的交互: 以发送请求到集群中的任一节点。 每个节点都有能力处理任意请求。 每个节点都知道集群中任一文档位置,所以可以直接将请求转发到需要的节点上。(当发送请求的时候, 为了扩展负载,更好的做法是轮询集群中所有的节点。)
24. 新建,索引和删除文档:新建、索引和删除 请求都是 写 操作,