前言 随着企业对近实时搜索的迫切需求,Elasticsearch受到越来越多的关注,无论是阿里、腾讯、京东等互联网企业,还是平安、顺丰等传统企业都对Elasticsearch有广泛的使用,但是在Elasticsearch6。8发布以前,大部分Elasticsearch功能都是付费的,开源版本的Elasticsearch在集群管控方面能力有限,鉴于此,通用的实施方案就是给Elasticsearch添加一层网关,从而实现对Elasticsearch的管控。Elasticsearch面试题1、elasticsearch了解多少,说说你们公司es的集群架构,索引数据大小,分片有多少,以及一些调优手段。面试官:想了解应聘者之前公司接触的ES使用场景、规模,有没有做过比较大规模的索引设计、规划、调优。解答:如实结合自己的实践场景回答即可。比如:ES集群架构13个节点,索引根据通道不同共20索引,根据日期,每日递增20,索引:10分片,每日递增1亿数据,每个通道每天索引大小控制:150GB之内。仅索引层面调优手段:1。1、设计阶段调优 (1)根据业务增量需求,采取基于日期模板创建索引,通过rolloverAPI滚动索引; (2)使用别名进行索引管理; (3)每天凌晨定时对索引做forcemerge操作,以释放空间; (4)采取冷热分离机制,热数据存储到SSD,提高检索效率;冷数据定期进行shrink操作,以缩减存储; (5)采取curator进行索引的生命周期管理; (6)仅针对需要分词的字段,合理的设置分词器; (7)Mapping阶段充分结合各个字段的属性,是否需要检索、是否需要存储等。1。2、写入调优 (1)写入前副本数设置为0; (2)写入前关闭refreshinterval设置为1,禁用刷新机制; (3)写入过程中:采取bulk批量写入; (4)写入后恢复副本数和刷新间隔; (5)尽量使用自动生成的id。1。3、查询调优 (1)禁用 (2)禁用批量terms(成百上千的场景); (3)充分利用倒排索引机制,能keyword类型尽量 (4)数据量大时候,可以先基于时间敲定索引再检索; (5)设置合理的路由机制。1。4、其他调优部署调优,业务调优等。上面的提及一部分,面试者就基本对你之前的实践或者运维经验有所评估了。2、elasticsearch的倒排索引是什么 lucene从4版本后开始大量使用的数据结构是FST。FST有两个优点: (1)空间占用小。通过对词典中单词前缀和后缀的重复利用,压缩了存储空间; (2)查询速度快。O(len(str))的查询时间复杂度。3、elasticsearch索引数据多了怎么办,如何调优,部署 面试官:想了解大数据量的运维能力。 解答:索引数据的规划,应在前期做好规划,正所谓设计先行,编码在后,这样才能有效的避免突如其来的数据激增导致集群处理能力不足引发的线上客户检索或者其他业务受到影响。 如何调优,正如问题1所说,这里细化一下:3。1动态索引层面 基于模板时间rolloverapi滚动创建索引,举例:设计阶段定义:blog索引的模板格式为:blogindex时间戳的形式,每天递增数据。这样做的好处:不至于数据量激增导致单个索引数据量非常大,接近于上线2的32次幂1,索引存储达到了TB甚至更大。 一旦单个索引很大,存储等各种风险也随之而来,所以要提前考虑及早避免。3。2存储层面 冷热数据分离存储,热数据(比如最近3天或者一周的数据),其余为冷数据。 对于冷数据不会再写入新数据,可以考虑定期forcemerge加shrink压缩操作,节省存储空间和检索效率。3。3部署层面一旦之前没有规划,这里就属于应急策略。结合ES自身的支持动态扩展的特点,动态新增机器的方式可以缓解集群压力,注意:如果之前主节点等规划合理,不需要重启集群也能完成动态新增的。4、elasticsearch是如何实现master选举的 1GETcatnodes?vhip,port,heapPercent,heapMax,id,name2ipportheapPercentheapMaxidname复制代码5、详细描述一下Elasticsearch索引文档的过程 6、详细描述一下Elasticsearch搜索的过程? 面试官:想了解ES搜索的底层原理,不再只关注业务层面了。 解答: 搜索拆解为querythenfetch两个阶段。 query阶段的目的:定位到位置,但不取。 步骤拆解如下: (1)假设一个索引数据有5主1副本共10分片,一次请求会命中(主或者副本分片中)的一个。 (2)每个分片在本地进行查询,结果返回到本地有序的优先队列中。 (3)第2)步骤的结果发送到协调节点,协调节点产生一个全局的排序列表。 fetch阶段的目的:取数据。 路由节点获取所有文档,返回给客户端。7、Elasticsearch在部署时,对Linux的设置有哪些优化方法 面试官:想了解对ES集群的运维能力。 解答: (1)关闭缓存 (2)堆内存设置为:Min(节点内存2,32GB); (3)设置最大文件句柄数; (4)线程池队列大小根据业务需要做调整; (5)磁盘存储raid方式存储有条件使用RAID10,增加单节点性能以及避免单节点存储故障。8、lucence内部结构是什么? 面试官:想了解你的知识面的广度和深度。 解答: Lucene是有索引和搜索的两个过程,包含索引创建,索引,搜索三个要点。可以基于这个脉络展开一些。9、Elasticsearch是如何实现Master选举的? (1)Elasticsearch的选主是ZenDiscovery模块负责的,主要包含Ping(节点之间通过这个RPC来发现彼此)和Unicast(单播模块包含一个主机列表以控制哪些节点需要ping通)这两部分; (2)对所有可以成为master的节点(node。master:true)根据nodeId字典排序,每次选举每个节点都把自己所知道节点排一次序,然后选出第一个(第0位)节点,暂且认为它是master节点。 (3)如果对某个节点的投票数达到一定的值(可以成为master节点数n21)并且该节点自己也选举自己,那这个节点就是master。否则重新选举一直到满足上述条件。 (4)补充:master节点的职责主要包括集群、节点和索引的管理,不负责文档级别的管理;data节点可以关闭http功能。10、Elasticsearch中的节点(比如共20个),其中的10个 选了一个master,另外10个选了另一个master,怎么办? (1)当集群master候选数量不小于3个时,可以通过设置最少投票通过数量(discovery。zen。minimummasternodes)超过所有候选节点一半以上来解决脑裂问题; (3)当候选数量为两个时,只能修改为唯一的一个master候选,其他作为data节点,避免脑裂问题。11、客户端在和集群连接时,如何选择特定的节点执行请求的? TransportClient利用transport模块远程连接一个elasticsearch集群。它并不加入到集群中,只是简单的获得一个或者多个初始化的transport地址,并以轮询的方式与这些地址进行通信。12、详细描述一下Elasticsearch索引文档的过程。 协调节点默认使用文档ID参与计算(也支持通过routing),以便为路由提供合适的分片shardhash(documentid)(numofprimaryshards)复制代码 (1)当分片所在的节点接收到来自协调节点的请求后,会将请求写入到MemoryBuffffer,然后定时(默认是每隔1秒)写入到FilesystemCache,这个从MomeryBuffffer到FilesystemCache的过程就叫做 (2)当然在某些情况下,存在MomeryBuffffer和FilesystemCache的数据可能会丢失,ES是通过translog的机制来保证数据的可靠性的。其实现机制是接收到请求后,同时也会写入到translog中,当Filesystemcache中的数据写入到磁盘中时,才会清除掉,这个过程叫做 (3)在flflush过程中,内存中的缓冲将被清除,内容被写入一个新段,段的fsync将创建一个新的提交点,并将内容刷新到磁盘,旧的translog将被删除并开始一个新的translog。 (4)flflush触发的时机是定时触发(默认30分钟)或者translog变得太大(默认为512M)时;补充:关于Lucene的Segement: (1)Lucene索引是由多个段组成,段本身是一个功能齐全的倒排索引。 (2)段是不可变的,允许Lucene将新的文档增量地添加到索引中,而不用从头重建索引。 (3)对于每一个搜索请求而言,索引中的所有段都会被搜索,并且每个段会消耗CPU的时钟周、文件句柄和内存。这意味着段的数量越多,搜索性能会越低。 (4)为了解决这个问题,Elasticsearch会合并小段到一个较大的段,提交新的合并段到磁盘,并删除那些旧的小段。13、Elasticsearch是一个分布式的RESTful风格的搜索和数据分析引擎。 (1)查询:Elasticsearch允许执行和合并多种类型的搜索结构化、非结构化、地理位置、度量指标搜索方式随心而变。 (2)分析:找到与查询最匹配的十个文档是一回事。但是如果面对的是十亿行日志,又该如何解读呢?Elasticsearch聚合让您能够从大处着眼,探索数据的趋势和模式。 (3)速度:Elasticsearch很快。真的,真的很快。 (4)可扩展性:可以在笔记本电脑上运行。也可以在承载了PB级数据的成百上千台服务器上运行。 (5)弹性:Elasticsearch运行在一个分布式的环境中,从设计之初就考虑到了这一点。 (6)灵活性:具备多个案例场景。数字、文本、地理位置、结构化、非结构化。所有的数据类型都欢迎。 (7)HADOOPSPARK:ElasticsearchHadoop14、Elasticsearch是一个高度可伸缩的开源全文搜索和分析引擎。它允许您快速和接近实时地存储、搜索和分析大量数据。 这里有一些使用Elasticsearch的用例: (1)你经营一个网上商店,你允许你的顾客搜索你卖的产品。在这种情况下,您可以使用Elasticsearch来存储整个产品目录和库存,并为它们提供搜索和自动完成建议。 (2)你希望收集日志或事务数据,并希望分析和挖掘这些数据,以查找趋势、统计、汇总或异常。在这种情况下,你可以使用loghide(ElasticsearchloghideKibana堆栈的一部分)来收集、聚合和解析数据,然后让loghide将这些数据输入到Elasticsearch中。一旦数据在Elasticsearch中,你就可以运行搜索和聚合来挖掘你感兴趣的任何信息。 (3)你运行一个价格警报平台,允许精通价格的客户指定如下规则:我有兴趣购买特定的电子设备,如果下个月任何供应商的产品价格低于X美元,我希望得到通知。在这种情况下,你可以抓取供应商的价格,将它们推入到Elasticsearch中,并使用其反向搜索(Percolator)功能来匹配价格走势与客户查询,并最终在找到匹配后将警报推送给客户。 (4)你有分析业务智能需求,并希望快速调查、分析、可视化,并对大量数据提出特别问题(想想数百万或数十亿的记录)。在这种情况下,你可以使用Elasticsearch来存储数据,然后使用Kibana(ElasticsearchloghideKibana堆栈的一部分)来构建自定义仪表板,以可视化对您来说很重要的数据的各个方面。此外,还可以使用Elasticsearch聚合功能对数据执行复杂的业务智能查询。15、详细描述一下Elasticsearch更新和删除文档的过程。 (1)删除和更新也都是写操作,但是Elasticsearch中的文档是不可变的,因此不能被删除或者改动以展示其变更; (2)磁盘上的每个段都有一个相应的。del文件。当删除请求发送后,文档并没有真的被删除,而是在。del文件中被标记为删除。该文档依然能匹配查询,但是会在结果中被过滤掉。当段合并时,在。del文件中被标记为删除的文档将不会被写入新段。 (3)在新的文档被创建时,Elasticsearch会为该文档指定一个版本号,当执行更新时,旧版本的文档在。del文件中被标记为删除,新版本的文档被索引到一个新段。旧版本的文档依然能匹配查询,但是会在结果中被过滤掉16、详细描述一下Elasticsearch搜索的过程。 17、在Elasticsearch中,是怎么根据一个词找到对应的倒排索引的? (1)Lucene的索引过程,就是按照全文检索的基本过程,将倒排表写成此文件格式的过程。 (2)Lucene的搜索过程,就是按照此文件格式将索引进去的信息读出来,然后计算每篇文档打分(score)的过程。18、Elasticsearch在部署时,对Linux的设置有哪些优化方法? (1)64GB内存的机器是非常理想的,但是32GB和16GB机器也是很常见的。少于8GB会适得其反。 (2)如果你要在更快的CPUs和更多的核心之间选择,选择更多的核心更好。多个内核提供的额外并发远胜过稍微快一点点的时钟频率。 (3)如果你负担得起SSD,它将远远超出任何旋转介质。基于SSD的节点,查询和索引性能都有提升。如果你负担得起,SSD是一个好的选择。 (4)即使数据中心们近在咫尺,也要避免集群跨越多个数据中心。绝对要避免集群跨越大的地理距离。 (5)请确保运行你应用程序的JVM和服务器的JVM是完全一样的。在Elasticsearch的几个地方,使用Java的本地序列化。 (6)通过设置gateway。recoverafternodes、gateway。expectednodes、gateway。recoveraftertime可以在集群重启的时候避免过多的分片交换,这可能会让数据恢复从数个 小时缩短为几秒钟。 (7)Elasticsearch默认被配置为使用单播发现,以防止节点无意中加入集群。只有在同一台机器上运行的节点才会自动组成集群。最好使用单播代替组播。 (8)不要随意修改垃圾回收器(CMS)和各个线程池的大小。 (9)把你的内存的(少于)一半给Lucene(但不要超过32GB!),通过ESHEAPSIZE环境变量设置。 (10)内存交换到磁盘对服务器性能来说是致命的。如果内存交换到磁盘上,一个100微秒的操作可能变成10毫秒。再想想那么多10微秒的操作时延累加起来。不难看出swapping对于性能是多么可怕。 (11)Lucene使用了大量的文件。同时,Elasticsearch在节点和HTTP客户端之间进行通信也使用了大量的套接字。所有这一切都需要足够的文件描述符。你应该增加你的文件描述符,设置一个很大的值,如64,000。19、对于GC方面,在使用Elasticsearch时要注意什么? (1)倒排词典的索引需要常驻内存,无法GC,需要监控datanode上segmentmemory增长趋势。 (2)各类缓存,fifieldcache,fifiltercache,indexingcache,bulkqueue等等,要设置合理的大小,并且要应该根据最坏的情况来看heap是否够用,也就是各类缓存全部占满的时候,还有heap空间可以分配给其他任务吗?避免采用clearcache等自欺欺人的方式来释放内存。 (3)避免返回大量结果集的搜索与聚合。确实需要大量拉取数据的场景,可以采用scanscrollapi来实现。 (4)clusterstats驻留内存并无法水平扩展,超大规模集群可以考虑分拆成多个集群通过tribenode连接。 (5)想知道heap够不够,必须结合实际应用场景,并对集群的heap使用情况做持续的监控。 (6)根据监控数据理解内存需求,合理配置各类circuitbreaker,将内存溢出风险降低到最低20、Elasticsearch对于大数据量(上亿量级)的聚合如何实现? Elasticsearch提供的首个近似聚合是cardinality度量。它提供一个字段的基数,即该字段的distinct或者unique值的数目。它是基于HLL算法的。HLL会先对我们的输入作哈希运算,然后根据哈希运算的结果中的bits做概率估算从而得到基数。其特点是:可配置的精度,用来控制内存的使用(更精确更多内存);小的数据集精度是非常高的;我们可以通过配置参数,来设置去重需要的固定内存使用量。无论数千还是数十亿的唯一值,内存使用量只与你配置的精确度相关。21、在并发情况下,Elasticsearch如果保证读写一致? (1)可以通过版本号使用乐观并发控制,以确保新版本不会被旧版本覆盖,由应用层来处理具体的冲突; (2)另外对于写操作,一致性级别支持quorumoneall,默认为quorum,即只有当大多数分片可用时才允许写操作。但即使大多数可用,也可能存在因为网络等原因导致写入副本失败,这样该副本被认为故障,分片将会在一个不同的节点上重建。 (3)对于读操作,可以设置replication为sync(默认),这使得操作在主分片和副本分片都完成后才会返回;如果设置replication为async时,也可以通过设置搜索请求参数preference为primary来查 询主分片,确保文档是最新版本。22、如何监控Elasticsearch集群状态? Marvel让你可以很简单的通过Kibana监控Elasticsearch。你可以实时查看你的集群健康状态和性能,也可以分析过去的集群、索引和节点指标。 23、介绍下你们电商搜索的整体技术架构。24、介绍一下你们的个性化搜索方案? 基于word2vec和Elasticsearch实现个性化搜索 (1)基于word2vec、Elasticsearch和自定义的脚本插件,我们就实现了一个个性化的搜索服务,相对于原有的实现,新版的点击率和转化率都有大幅的提升; (2)基于word2vec的商品向量还有一个可用之处,就是可以用来实现相似商品的推荐; (3)使用word2vec来实现个性化搜索或个性化推荐是有一定局限性的,因为它只能处理用户点击历史这样的时序数据,而无法全面的去考虑用户偏好,这个还是有很大的改进和提升的空间;25、是否了解字典树? 常用字典数据结构如下所示: Trie的核心思想是空间换时间,利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。 它有3个基本性质: 1)根节点不包含字符,除根节点外每一个节点都只包含一个字符。 2)从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。 3)每个节点的所有子节点包含的字符都不相同。 或者用数组来模拟动态。而空间的花费,不会超过单词数单词长度。 (2)实现:对每个结点开一个字母集大小的数组,每个结点挂一个链表,使用左儿子右兄弟表示法记 录这棵树; (3)对于中文的字典树,每个节点的子节点用一个哈希表存储,这样就不用浪费太大的空间,而且查 询速度上可以保留哈希的复杂度O(1)26、拼写纠错是如何实现的? (1)拼写纠错是基于编辑距离来实现;编辑距离是一种标准的方法,它用来表示经过插入、删除和替换操作从一个字符串转换到另外一个字符串的最小操作步数; (2)编辑距离的计算过程:比如要计算batyu和beauty的编辑距离,先创建一个78的表(batyu长度为5,coffffee长度为6,各加2),接着,在如下位置填入黑色数字。其他格的计算过程是取以下 三个值的最小值: 如果最上方的字符等于最左方的字符,则为左上方的数字。否则为左上方的数字1。(对于3,3来说为0) 左方数字1(对于3,3格来说为2) 上方数字1(对于3,3格来说为2) 最终取右下角的值即为编辑距离的值3。 感谢阅读,由于篇幅所限,本文各类问题都只挑了几个比较有代表的题目进行解答,但我整理的面试真题却绝不止这些。这些知识点的导图和问题的答案详解的PDF文档都可以免费分享给大家,点赞收藏文章后,私信【资料】免费领取!