一、生成document id
1、自动生成document id
自动生成的id,长度为20个字符,URL安全,base64编码,GUID,分布式系统并行生成时不可能会发生冲突
语法:POST /index/type
POST /test_index/test_type{"test_content": "my test"}返回结果:
{"_index": "test_index","_type": "test_type","_id": "AVp4RN0bhjxldOOnBxaE","_version": 1,"result": "created","_shards": {"total": 2,"successful": 1,"failed": 0},"created": true}
2、手动指定document id
语法:PUT /index/type/idPUT /test_index/test_type/2{"test_content": "my test"}
二、document的创建和删除
1、document的全量替换
(1)语法与创建文档是一样的,如果document id不存在,那么就是创建;如果document id已经存在,那么就是全量替换操作,替换document的json串内容(2)document是不可变的,如果要修改document的内容,第一种方式就是全量替换,直接对document重新建立索引,替换里面所有的内容(3)es会将老的document标记为deleted,然后新增我们给定的一个document,当我们创建越来越多的document的时候,es会在适当的时机在后台自动删除标记为deleted的document2、document的强制创建
( 1)创建文档与全量替换的语法是一样的,有时我们只是想新建文档,不想替换文档,如果强制进行创建呢?(2)PUT /index/type/id?op_type=create,PUT /index/type/id/_create3、document的删除
(1)DELETE /index/type/id(2)不会理解物理删除,只会将其标记为deleted,当数据越来越多的时候,在后台自动删除
三、document路由
1、 document路由含义:
表示新增document时es如何决定将其存放在index的哪个shard上,查询时es又是如何在某个shard上查询指定的document。
2、路由算法:
路由公式:
shard = hash(routing) % number_of_primary_shards (结果在0~number_of_primary_shards-1之间)
注意:primary shard的数量是固定不变的
routing : 每次增删改查一个document时都会带来的一个routing number,默认为document的_id,也可以自定义routing值.通过在PUT请求内指定routing参数值。
如:put /index/type/id?routing=user_id
number_of_primary_shards:primary shard的数量
四、document的增删改查原理
1、document增删改的请求处理过程
(1)协调节点接收来自客户端的document增删改查请求
(2)协调节点根据路由算法将document的增删改查请求分发给primary shard
(3)primary shard接收到来自协调点的请求后将请求写入transaction log 并将document写入内存缓存内。内存缓存每隔一秒将document数据同步至文件系统缓存内。增删改请求在primary shard上处理成功后,该请求将并行发送到其他的replica shard上。当transaction log同步至所有的分片上后将结果通知给客户端。
(4)transaction log文件每隔30分钟或者文件过大的时候会触发es的冲洗flush过程。es的冲洗将文件系统缓存内的数据同步至磁盘并将transaction log清空。内存缓存内的数据也将同步至文件系统缓存并刷新到磁盘内。
(5)tansaction log文件还每隔5秒将写请求数据同步至磁盘。
(6)删除请求和更新请求会将document在.del文件内的数据标记为deleted,es周期性清除del文件内的数据
2.document的读请求处理过程
(1)客户端将读请求发给协调点
(2)协调点将读请求打到所有的shard上,每个shard独立执行查询,并根据查询结果创建一个按照相关性得分排序的优先队列
(3)每个shard处理完成后将优先队列内的前10个相关性得分最高的返回给协调点
(4)协调点根据各个shard返回的数据创建一个按照相关性得分排序的有限队列,并将前10个得分最高的作为hits返回给客户端。
3.document相关性打分
es 默认使用的排序算法是tf/idf(词频/逆文档频率), 最后的得分是tf-idf得分与其他因子比如(短语查询中的)词项接近度、(模糊查询中的)词项相似度等的组合
(1)词频:统计一个词项在文档中出现的次数,频率越高,相关性得分越高
(2)逆文档频率:统计一个词项在全部索引中的出现的频率,是一个索引中文档的总数的百分比,频率越高,相关性得分越高