Elasticsearch(四)

 1.图解Elasticsearch 容错机制:master选举、replica容错、数据恢复。

master node宕机,自动master选举 red

初步解析document的核心元数:_index,_type,_id

{
  "_index" : "test_index",
  "_type" : "test_type",
  "_id" : "1",
  "_version" : 1,
  "_seq_no" : 0,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "test_content" : "test test"
  }
}

1._index元数据

a.代表一个document存放在哪个index中

b.类似的数据放在在一个索引,非类似的数据放 在不同索引。product index(包含所有的商品) sales index(包含所有的商品销售数据)

c.index中包含了很多类似的document。 其实说 这些document的fileds很大一部分是相同。

d.索引名称必须是小写的,不能用下止划线开头,不能包含逗号。

创建index反例分析图

2._index

a.代表document属于index中的哪个index中的些许不同的几类数据分析。

b.一个索引通常会划分为多个type,逻辑上对index中有些许不同的几类数据进行分析。因为一批相同的数据,可能有很多相同的fields,但是还是可能有一些轻微的不同,可能会有少数fields是不一样的,如:商品 可能划分为电子商品,生鲜商品,日化商品 等等。

c.type名称可以是大写或者小写和,但是同时不能用下划开头,不能包含逗号。

3._id元数据

a.代表document的唯一标识,与index和type一起 可以唯一标识和定位一个document

b . 我们可以手动指定doccment的id也可以不指定 由es自动为我们创建一个id.

手动指定document id

a.根据应用情况来部,是否满足手动指定document id 的前提。一般来说 是从某些其他的系统中,导入一些数据到ao会采取这种方式 就是呀使用系统中已有的数据的唯一 标识,作为es中document的id

 

b.put /index/type/id

 

2.自动生成document id

(1) post  /index/test_type

POST /test_index/test_type
{
  "test_content":"my test"
}

 

2).自动生成的id 长度是20脸上字符 URL安全 base64编码,GUID分布工系统并行生成时不可能发生冲突

 

1._source 元数据

2.定制返回 结果

PUT /test_index/test_type/1
{
  "test_field1":"test_field1",
   "test_field2":"test_field2"
}
{
  "_index" : "test_index",
  "_type" : "test_type",
  "_id" : "1",
  "_version" : 2,
  "_seq_no" : 2,
  "_primary_term" : 2,
  "found" : true,
  "_source" : {
    "test_field1" : "test_field1",
    "test_field2" : "test_field2"
  }
}

_source 元数据 就是说 我们在 创建一个document的时候,使用的那个放在requst body中的json串 ,默认情况下 在get的时候 ,会原封不动的给我们返回回来。

定制返回的结果 指定_source中 返回哪些field

GET /test_index/test_type/1?_source=test_field2 (多个时用逗号隔分)

{
  "_index" : "test_index",
  "_type" : "test_type",
  "_id" : "1",
  "_version" : 2,
  "_seq_no" : 2,
  "_primary_term" : 2,
  "found" : true,
  "_source" : {
    "test_field2" : "test_field2"
  }
}

3.document的全量替换

1.语法与创建文档是一样的,如果documet id 不存在 那么就是创建 如果document id已经存在 那么就是全量替换的,替换document的jsonm的内容

2.document是不可变的,要修改document的内容,第一种方式就是倒是替换,直接document重新建立索引,替换里面所有的内容。

3.es会将老的document标为deleted,然后新增我们给给定的一个document,当我们创建越来越多的document的时候,es会在适当时机后台自动删除标记为deleted的document.

4.document的强制创建

1.创建文档与全量替换的语法是一样的,有时我们只是想新建文档,不想替换文档,如果强制进行创建 呢

2.PUT /indx/type/id?op_type=create. PUT/index/type/id/_create

5.document的删除

(1) DELETE /index/type/id

(2)不会理解物理删除,只会将其标记为deleted,当数据越来越多的时候,在后台自动删除。

6.elasticsearch并发冲突问题

7.悲观锁与乐观控制方案

8.图解Elasticsearch内部如何基于_version进行乐观锁并发控制

(1)_version元数据

第一次创建一个doucment的时候,它的_version内部版本号就是1,每次对这个document执行修改或者删除操作,都会对这个_version版本号自动加1,哪怕是删除也会对这条数据的版本号加1

我们会发现,在删除一个document之后,可以人一个侧面证明,它不是立即物理删除掉的,因为它一些版本号等信息还是保留着的,先删除一条document 再重新创建 这个document,其实会在delete version基础 之上,再把version号加1


9.上机动手实战演练基于_version(新版本更新为if_seq_no和if_primary_term)进行乐观并发控制

(1)先构造一条数据出来

PUT /test_index/test_type/7
{
  "test_filed":"test test"
}

(2)模拟两个客户端,都获取到了同一条数据

{
  "_index" : "test_index",
  "_type" : "test_type",
  "_id" : "7",
  "_version" : 1,
  "_seq_no" : 3,
  "_primary_term" : 4,
  "found" : true,
  "_source" : {
    "test_filed" : "test test"
  }
}

(3)其中一个客户端,先更新一下这个数据,同时带上数据的版本号,确保说,es中的数据 的版本号,跟客户端中的数据的版本号是相同才能修改

PUT /test_index/test_type/7?if_seq_no=5&if_primary_term=4
{
  "test_filed":"test clinet1"
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值