1.核心概念
(1)什么是document?
document是个文件,里面有很多file。比如
{
"name":"小红",
"age":"18"
}
这就一个文件,而name就是个file,age也是
(2)什么是index?
在我的理解es里的index概念就像是个数据库,里面存放很多个document
(3)什么是type?
比如document是存放动物的数据,那么type就是把动物的类型分类,比如猫科,狗科,鸟科等
(4)什么是shard和replica?
如果有个10T的数据,有5台服务器,每个服务器只能放2T的数据,怎么办?
分布式解决:那么就是理解10T为index,数据分成5份,每个服务器放2T的数据,而这5台服务器就是shard。
当有台服务器宕机了怎么办!所以就为这5台服务器分别配了台备用服务器,称为replica,至少一台shard服务器宕机了,还有代替。这样的话,拿数据就可以在replica拿,又可以在shard拿了,基本上不用怕数据同步问题,因为es是实时性的
2.简单的实操
(1)GET
结构:GET /index/type/id
例:
GET /shopping/category/1
返回
{
"_index": "shopping",
"_type": "category",
"_id": "1",
"_version": 1,
"found": true,
"_source": {
"name": "xiao hong",
"type": "cat",
"dscription": "most small",
"age": 7,
"child": {
"num": 10,
"category": "not"
}
}
}
(2)DELETE
结构:DELETE /index/type/id
例:DELETE /shopping/category/1
返回:
{
"_index": "shopping",
"_type": "category",
"_id": "1",
"_version": 6,
"result": "deleted",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 5,
"_primary_term": 1
}
这个只是打上delete标签,并不是真正的删除
(3)PUT
结构:
PUT /index/type/id
{
"field":"text"
}
例:
PUT /shopping/category/1
{
"name":"xiao hong",
"type":"cat",
"dscription":"most small",
"age":7,
"child":{
"num":10,
"category":"not"
}
}
返回:
{
"_index": "shopping",
"_type": "category",
"_id": "1",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}
_shard:一共有多少分片,虽然默认有5个shard和5个replica,但是一个document只会存放在一个shard里面,而一个shard有个replica,而我这只有个shard,没有replica,所有只有一个成功。
_seq_no:严格递增的顺序号,每个文档一个,Shard级别严格递增,保证后写入的Doc的_seq_no大于先写入的Doc的_seq_no。
任何类型的写操作,包括index、create、update和Delete,都会生成一个_seq_no。这个是不可改的,而_version这个版本号是可以改的,后面会讲
_primary_term:_primary_term也和_seq_no一样是一个整数,每当Primary Shard发生重新分配时,比如重启,Primary选举等,_primary_term会递增1。
_primary_term主要是用来恢复数据时处理当多个文档的_seq_no一样时的冲突,比如当一个shard宕机了,raplica需要用到最新的数据,就会根据_primary_term和_seq_no这两个值来拿到最新的document
PUTdocument的时候,当ES里面有数据的时候,新数据会覆盖旧数据(旧数据会被打上delete标签,不会马上删除,只会等到内存不够的情况下才会真正的删除,然后会创建新的document)
(4)POST
结构:
POST /index/type/id
{
"doc":{
"field":"text"
}
}
例:
POST /shopping/category/1/_update
{
"doc":{
"name":"xiao ming",
"sex":"man"
}
}
返回:
{
"_index": "shopping",
"_type": "category",
"_id": "1",
"_version": 2,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 1,
"_primary_term": 1
}
![](https://i-blog.csdnimg.cn/blog_migrate/d0c03c838f4b8b333c93673cec9a64e8.png)
首先这个document必须存在。如果document本身没有这个field,那么也会添加到里面去(ES会将原先的document复制一份出来,然后在新的这个document上修改,修改完成后,在把原先的删除,也就是打上delete标签)