设计网站专业,云南旅行社网站开发,网站建设图片尺寸,网站建设的目标是什么 提供了哪些栏目点击上方“Java面试题精选”#xff0c;关注公众号面试刷图#xff0c;查缺补漏号外#xff1a;往期面试题#xff0c;10篇为一个单位归置到本公众号菜单栏-面试题#xff0c;有需要的欢迎翻阅阶段汇总集合#xff1a;一百期面试题汇总面试题ES 写入数据的工… 点击上方“Java面试题精选”关注公众号面试刷图查缺补漏号外往期面试题10篇为一个单位归置到本公众号菜单栏-面试题有需要的欢迎翻阅阶段汇总集合一百期面试题汇总面试题ES 写入数据的工作原理是什么啊ES 查询数据的工作原理是什么啊底层的 Lucene 介绍一下呗倒排索引了解吗面试官心理分析问这个其实面试官就是要看看你了解不了解 es 的一些基本原理因为用 es 无非就是写入数据搜索数据。你要是不明白你发起一个写入和搜索请求的时候es 在干什么那你真的是......对 es 基本就是个黑盒你还能干啥你唯一能干的就是用 es 的 api 读写数据了。要是出点什么问题你啥都不知道那还能指望你什么呢面试题剖析es 写数据过程客户端选择一个 node 发送请求过去这个 node 就是 coordinating node (协调节点)。coordinating node 对 document 进行路由将请求转发给对应的 node(有 primary shard)。实际的 node 上的 primary shard 处理请求然后将数据同步到 replica node 。coordinating node 如果发现 primary node 和所有 replica node 都搞定之后就返回响应结果给客户端。es-writees 读数据过程可以通过 doc id 来查询会根据 doc id 进行 hash判断出来当时把 doc id 分配到了哪个 shard 上面去从那个 shard 去查询。客户端发送请求到任意一个 node成为 coordinate node 。coordinate node 对 doc id 进行哈希路由将请求转发到对应的 node此时会使用 round-robin 随机轮询算法在 primary shard 以及其所有 replica 中随机选择一个让读请求负载均衡。接收请求的 node 返回 document 给 coordinate node 。coordinate node 返回 document 给客户端。es 搜索数据过程es 最强大的是做全文检索就是比如你有三条数据java真好玩儿啊java好难学啊j2ee特别牛Copy to clipboardErrorCopied你根据 java 关键词来搜索将包含 java 的 document 给搜索出来。es 就会给你返回java真好玩儿啊java好难学啊。客户端发送请求到一个 coordinate node 。协调节点将搜索请求转发到所有的 shard 对应的 primary shard 或 replica shard 都可以。query phase每个 shard 将自己的搜索结果(其实就是一些 doc id )返回给协调节点由协调节点进行数据的合并、排序、分页等操作产出最终结果。fetch phase接着由协调节点根据 doc id 去各个节点上拉取实际的 document 数据最终返回给客户端。写请求是写入 primary shard然后同步给所有的 replica shard读请求可以从 primary shard 或 replica shard 读取采用的是随机轮询算法。写数据底层原理es-write-detail先写入内存 buffer在 buffer 里的时候数据是搜索不到的同时将数据写入 translog 日志文件。如果 buffer 快满了或者到一定时间就会将内存 buffer 数据 refresh 到一个新的 segment file 中但是此时数据不是直接进入 segment file 磁盘文件而是先进入 os cache 。这个过程就是 refresh 。每隔 1 秒钟es 将 buffer 中的数据写入一个新的 segment file 每秒钟会产生一个新的磁盘文件 segment file 这个 segment file 中就存储最近 1 秒内 buffer 中写入的数据。但是如果 buffer 里面此时没有数据那当然不会执行 refresh 操作如果 buffer 里面有数据默认 1 秒钟执行一次 refresh 操作刷入一个新的 segment file 中。操作系统里面磁盘文件其实都有一个东西叫做 os cache 即操作系统缓存就是说数据写入磁盘文件之前会先进入 os cache 先进入操作系统级别的一个内存缓存中去。只要 buffer 中的数据被 refresh 操作刷入 os cache 中这个数据就可以被搜索到了。为什么叫 es 是准实时的NRT 全称 near real-time 。默认是每隔 1 秒 refresh 一次的所以 es 是准实时的因为写入的数据 1 秒之后才能被看到。可以通过 es 的 restful api 或者 java api 手动执行一次 refresh 操作就是手动将 buffer 中的数据刷入 os cache 中让数据立马就可以被搜索到。只要数据被输入 os cache 中buffer 就会被清空了因为不需要保留 buffer 了数据在 translog 里面已经持久化到磁盘去一份了。重复上面的步骤新的数据不断进入 buffer 和 translog不断将 buffer 数据写入一个又一个新的 segment file 中去每次 refresh 完 buffer 清空translog 保留。随着这个过程推进translog 会变得越来越大。当 translog 达到一定长度的时候就会触发 commit 操作。commit 操作发生第一步就是将 buffer 中现有数据 refresh 到 os cache 中去清空 buffer。然后将一个 commit point 写入磁盘文件里面标识着这个 commit point 对应的所有 segment file 同时强行将 os cache 中目前所有的数据都 fsync 到磁盘文件中去。最后清空 现有 translog 日志文件重启一个 translog此时 commit 操作完成。这个 commit 操作叫做 flush 。默认 30 分钟自动执行一次 flush 但如果 translog 过大也会触发 flush 。flush 操作就对应着 commit 的全过程我们可以通过 es api手动执行 flush 操作手动将 os cache 中的数据 fsync 强刷到磁盘上去。translog 日志文件的作用是什么你执行 commit 操作之前数据要么是停留在 buffer 中要么是停留在 os cache 中无论是 buffer 还是 os cache 都是内存一旦这台机器死了内存中的数据就全丢了。所以需要将数据对应的操作写入一个专门的日志文件 translog 中一旦此时机器宕机再次重启的时候es 会自动读取 translog 日志文件中的数据恢复到内存 buffer 和 os cache 中去。translog 其实也是先写入 os cache 的默认每隔 5 秒刷一次到磁盘中去所以默认情况下可能有 5 秒的数据会仅仅停留在 buffer 或者 translog 文件的 os cache 中如果此时机器挂了会丢失 5 秒钟的数据。但是这样性能比较好最多丢 5 秒的数据。也可以将 translog 设置成每次写操作必须是直接 fsync 到磁盘但是性能会差很多。实际上你在这里如果面试官没有问你 es 丢数据的问题你可以在这里给面试官炫一把你说其实 es 第一是准实时的数据写入 1 秒后可以搜索到可能会丢失数据的。有 5 秒的数据停留在 buffer、translog os cache、segment file os cache 中而不在磁盘上此时如果宕机会导致 5 秒的数据丢失。总结一下数据先写入内存 buffer然后每隔 1s将数据 refresh 到 os cache到了 os cache 数据就能被搜索到(所以我们才说 es 从写入到能被搜索到中间有 1s 的延迟)。每隔 5s将数据写入 translog 文件(这样如果机器宕机内存数据全没最多会有 5s 的数据丢失)translog 大到一定程度或者默认每隔 30mins会触发 commit 操作将缓冲区的数据都 flush 到 segment file 磁盘文件中。数据写入 segment file 之后同时就建立好了倒排索引。删除/更新数据底层原理如果是删除操作commit 的时候会生成一个 .del 文件里面将某个 doc 标识为 deleted 状态那么搜索的时候根据 .del 文件就知道这个 doc 是否被删除了。如果是更新操作就是将原来的 doc 标识为 deleted 状态然后新写入一条数据。buffer 每 refresh 一次就会产生一个 segment file 所以默认情况下是 1 秒钟一个 segment file 这样下来 segment file 会越来越多此时会定期执行 merge。每次 merge 的时候会将多个 segment file 合并成一个同时这里会将标识为 deleted 的 doc 给物理删除掉然后将新的 segment file 写入磁盘这里会写一个 commit point 标识所有新的 segment file 然后打开 segment file 供搜索使用同时删除旧的 segment file 。底层 lucene简单来说lucene 就是一个 jar 包里面包含了封装好的各种建立倒排索引的算法代码。我们用 Java 开发的时候引入 lucene jar然后基于 lucene 的 api 去开发就可以了。通过 lucene我们可以将已有的数据建立索引lucene 会在本地磁盘上面给我们组织索引的数据结构。倒排索引在搜索引擎中每个文档都有一个对应的文档 ID文档内容被表示为一系列关键词的集合。例如文档 1 经过分词提取了 20 个关键词每个关键词都会记录它在文档中出现的次数和出现位置。那么倒排索引就是关键词到文档 ID 的映射每个关键词都对应着一系列的文件这些文件中都出现了关键词。举个栗子。有以下文档DocIdDoc1谷歌地图之父跳槽 Facebook2谷歌地图之父加盟 Facebook3谷歌地图创始人拉斯离开谷歌加盟 Facebook4谷歌地图之父跳槽 Facebook 与 Wave 项目取消有关5谷歌地图之父拉斯加盟社交网站 Facebook对文档进行分词之后得到以下倒排索引。WordIdWordDocIds1谷歌1, 2, 3, 4, 52地图1, 2, 3, 4, 53之父1, 2, 4, 54跳槽1, 45Facebook1, 2, 3, 4, 56加盟2, 3, 57创始人38拉斯3, 59离开310与4......另外实用的倒排索引还可以记录更多的信息比如文档频率信息表示在文档集合中有多少个文档包含某个单词。那么有了倒排索引搜索引擎可以很方便地响应用户的查询。比如用户输入查询 Facebook 搜索系统查找倒排索引从中读出包含这个单词的文档这些文档就是提供给用户的搜索结果。要注意倒排索引的两个重要细节倒排索引中的所有词项对应一个或多个文档倒排索引中的词项根据字典顺序升序排列上面只是一个简单的例子并没有严格按照字典顺序升序排列。来源https://doocs.gitee.io/#/与其在网上拼命找题 不如马上关注我们~