家庭带宽100m做网站,导购网站怎么建,湖南英文网站建设,凡科邮箱索引原理
倒排索引
倒排索引#xff08;Inverted Index#xff09;也叫反向索引#xff0c;有反向索引必有正向索引。通俗地来讲#xff0c;正向索引是通过key找value#xff0c;反向索引则是通过value找key。ES底层在检索时底层使用的就是倒排索引。
索引模型
现有索… 索引原理
倒排索引
倒排索引Inverted Index也叫反向索引有反向索引必有正向索引。通俗地来讲正向索引是通过key找value反向索引则是通过value找key。ES底层在检索时底层使用的就是倒排索引。
索引模型
现有索引和映射如下:
{products : {mappings : {properties : {description : {type : text},price : {type : float},title : {type : keyword}}}}
}先录入如下数据有三个字段title、price、description等
_idtitlepricedescription1蓝月亮洗衣液19.9蓝月亮洗衣液很高效2iphone1319.9很不错的手机3小浣熊干脆面1.5小浣熊很好吃
在ES中除了text类型分词其他类型不分词因此根据不同字段创建索引如下 title字段: term_id(文档id)蓝月亮洗衣液1iphone132小浣熊干脆面3 price字段 term_id(文档id)19.9[1,2]1.53 description字段 term_idterm_idterm_id蓝1不2小3月1错2浣3亮1的2熊3洗1手2好3衣1机2吃3液1很[1:1:9,2:1:6,3:1:6]高1效1
注意: Elasticsearch分别为每个字段都建立了一个倒排索引。因此查询时查询字段的term,就能知道文档ID就能快速找到文档。
数据写入流程 先写入buffer在buffer里的时候数据是搜索不到的同时将数据写入translog日志文件 如果buffer快满了或者到一定时间就会将buffer数据refresh到一个新的segment file中但是此时数据不是直接进入segment file的磁盘文件的而是先进入os cache的。这个过程就是refresh。为什么叫es是准实时的NRTnear real-time准实时。默认是每隔1秒refresh一次的所以es是准实时的因为写入的数据1秒之后才能被看到。 只要数据进入os cache此时就可以让这个segment file的数据对外提供搜索了 重复1~3步骤新的数据不断进入buffer和translog不断将buffer数据写入一个又一个新的segment file中去每次refresh完buffer清空translog保留。随着这个过程推进translog会变得越来越大。当translog达到一定长度的时候就会触发mit操作。 mit操作发生第一步就是将buffer中现有数据refresh到os cache中去清空buffer 将一个mit point写入磁盘文件里面标识着这个mit point对应的所有segment file 强行将os cache中目前所有的数据都fsync到磁盘文件中 将现有的translog清空然后再次重启启用一个translog此时mit操作完成。默认每隔30分钟会自动执行一次mit但是如果translog过大也会触发mit。整个mit的过程叫做flush操作。我们可以手动执行flush操作就是将所有os cache数据刷到磁盘文件中去。 es中的flush操作就对应着mit的全过程。我们也可以通过es api手动执行flush操作手动将os cache中的数据fsync强刷到磁盘上去记录一个mit point清空translog日志文件。 translog其实也是先写入os cache的默认每隔5秒刷一次到磁盘中去所以默认情况下可能有5秒的数据会仅仅停留在buffer或者translog文件的os cache中如果此时机器挂了会丢失5秒钟的数据。但是这样性能比较好最多丢5秒的数据。也可以将translog设置成每次写操作必须是直接fsync到磁盘但是性能会差很多。 如果是删除操作mit的时候会生成一个.del文件里面将某个doc标识为deleted状态那么搜索的时候根据.del文件就知道这个doc被删除了 如果是更新操作就是将原来的doc标识为deleted状态然后新写入一条数据 buffer每次refresh一次就会产生一个segment file所以默认情况下是1秒钟一个segment filesegment file会越来越多此时会定期执行merge 每次merge的时候会将多个segment file合并成一个同时这里会将标识为deleted的doc给物理删除掉然后将新的segment file写入磁盘这里会写一个mit point标识所有新的segment file然后打开segment file供搜索使用同时删除旧的segment file。 es里的写流程有4个底层的核心概念refresh、flush、translog、merge 当segment file多到一定程度的时候es就会自动触发merge操作将多个segment file给merge成一个segment file。 数据查询流程 客户端发送请求到任意一个node成为coordinate node coordinate node对document进行路由将请求转发到对应的node此时会使用round-robin随机轮询算法在primary shard以及其所有replica中随机选择一个让读请求负载均衡 接收请求的node返回document给coordinate node coordinate node返回document给客户端 今天的分享就到这里喜欢的朋友可以点赞收藏感谢