05_Elastic Stack 从入门到实践(五)
一、Elasticsearch集群之分布式文档(文档的写操作、搜索操作)
1、文档的写操作
1)新建、索引和删除请求都是写(write)操作,它们必须在主分片上成功完成才能复制到相关的复制分片上。
2)下面我们罗列在主分片和复制分片上成功新建、索引或删除一个文档必要的顺序步骤:
– 客户端给 Node 1发送新建、索引或删除请求。
– 节点使用文档的_id确定文档属于分片0。它转发请求到Node3,分片0位于这个节点上。
– Node 3在主分片上执行请求,如果成功,它转发请求到相应的位于Node 1和Node2的复制节点上。当所有的复制节点报告成功,Node3报告成功到请求的节点,请求的节点再报告给客户端。
2、搜索文档(单个文档)
1)文档能够从主分片或任意一个复制分片被检索。
2)下面我们罗列在主分片或复制分片上检索一个文档必要的顺序步骤:
— 客户端给 Node 1发送get请求。
— 节点使用文档的_id确定文档属于分片0。分片0对应的复制分片在三个节点上都有。此时,它转发请求到Node 2.
— Node2返回文档(document)给Node1然后返回给客户端。
3)对于读请求,为了平衡负载,请求节点会为每个请求选择不同的分片–它会循环所有分片副本。
4)可能的情况是,一个被索引的文档已经存在于主分片上却还没来得及同步到复制分片上。这时复制分片会报告文档未找到,主分片会成功返回文档。一旦索引请求成功返回给用户,文档则在主分片和复制分片都是可用的。
二、Elasticsearch集群之分布式文档(全文搜索)
1、elasticsearch全文搜索
1)对于全文搜索而言,文档可能分散在各个节点上,那么在分布式的情况下,如何搜索文档呢?
2)elasticsearch全文搜索搜索分为2个阶段,搜索(query)+取回(fetch)。
2、搜索(query)查询阶段包含以下三步:
1)客户端发送一个search(搜索)请求给Node 3, Node3创建了一个长度为from+size的空优先级队
2)Node 3 转发这个搜索请求到索引中每个分片的原本或副本。每个分片在本地执行这个查询并且结果将结果到
一个大小为 from+size的有序本地优先队列里去。
3)每个分片返回document的ID和它优先队列里的所有document的排序值给协调节点Node 3。Node3把这些值合并到自己的优先队列里产生全局排序结果。
3、取回(fetch)
4、取回(fetch)分发阶段由以下步骤构成:
1)协调节点辨别出哪个document需要取回,并且向相关分片发出GET请求。
2)每个分片加载documlenit并且根据需要丰富(enrich)它们,然后再将document返回协调节点。
3)一旦所有的document都被取回,协调节点会将结果返回给客户端。
三、Elasticsearch的Java客户端之介绍以及构造数据
1、Elasticsearch的Java客户端
在Elasticsearch中,为java提供了2种客户端,一种是RIEST风格的客户端,另一种是Java API的客户端。
https://www.elastic.co/guide/en/elasticsearch/client/index.html
2、REST 客户端
Elasticsearch 提供了2种REST客户端:一种是低级客户端,一种是高级客户端。
1)Java Low Level REST Client:
官方提供的低级客户端。该客户端通过http来连接Elasticsearch集群。用户在使用该客户端时需要将请求数据手动拼接成Elasticsearch所需JSON格式进行发送,收到响应时同样也需要将返回的JSON数据手动封装成对象。虽然麻烦,不过该客户端兼容所有的Elasticsearch版本。
2)Java High LevelREST Client:
官方提供的高级客户端。该客户端基于低级客户端实现,它提供了很多便捷的
API来解决低级客户端需要手动转换数据格式的问题。
3、Elasticsearch 构造数据 实操 示例
1)打开谷歌浏览器(安装有es-head插件),连接elasticsearch服务器。并创建索引 haoke。分片数为5,副本数为1。
2)打开 Postman 软件,选择POST请求,
3)地址栏输入:如:http://192.168.196.119:9200/haoke/house/_bulk
4)请求体为 JSON 数据类型,请求内容为以下(注意最后有一空行):
#POST http://192.168.196.119:9200/haoke/house/_bulk
{
"index":{
"_index":"haoke","_type":"house"}}
{
"id":"1001","title":"整租 · 南丹大楼1居室7500","price":"7500"}
{
"index":{
"_index":"haoke","_type":"house"}}
{
"id":"1002","title":"陆家嘴板块,精装设计一室一厅,可拎包入住诚意租。","price":"8500"}
{
"index":{
"_index":"haoke","_type":"house"}}
{
"id":"1003","title":"整租·健安坊 1居室4050","price":"7500"}
{
"index":{
"_index":"haoke","_type":"house"}}
{
"id":"1004","title":"整租·中凯城市之光+视野开阔+景色秀丽+拎包入住","price":"6500"}
{
"index":{
"_index":"haoke","_type":"house"}}
{
"id":"1005","title":"整租 · 南京西路品质小区21213三轨交汇 配套齐*拎包入住","price":"6000"}
{
"index":{
"_index":"haoke","_type":"house"}}
{
"id":"1006","title":"祥康里 简约风格*南户型 拎包入住 看房随时","price":"7000"}
5)响应数据如下:
{
"took": 3271,
"errors": false,
"items": [
{
"index": {
"_index": "haoke",
"_type": "house",
"_id": "2PX_PpYBbZPp9TaeL7Eq",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 2,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1,
"status": 201
}
},
{
"index": {
"_index": "haoke",
"_type": "house",
"_id": "2fX_PpYBbZPp9TaeL7Eq",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 2,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1,
"status": 201
}
},
{
"index": {
"_index": "haoke",
"_type": "house",
"_id": "2vX_PpYBbZPp9TaeL7Er",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 2,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1,
"status": 201
}
},
{
"index": {
"_index": "haoke",
"_type": "house",
"_id": "2_X_PpYBbZPp9TaeL7Er",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 2,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1,
"status": 201
}
},
{
"index": {
"_index": "haoke",
"_type": "house",
"_id": "3PX_PpYBbZPp9TaeL7Er",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 2,
"failed": 0
},
"_seq_no": 1,
"_primary_term": 1,
"status": 201
}
},
{
"index": {
"_index": "haoke",
"_type"