elk⾯试题_ElasticSearch常见经典⾯试题
1.为什么要使⽤Elasticsearch?
因为在我们商城中的数据,将来会⾮常多,所以采⽤以往的模糊查询,模糊查询前置配置,会放弃索引,导致商品查询是全表扫⾯,在百万级别的数据库中,效率⾮常低下,⽽我们使⽤ES做⼀个全⽂索引,我们将经常查询的商品的某些字段,⽐如说商品名,描述、价格还有id这些字段我们放⼊我们索引库⾥,可以提⾼查询速度。
2.Elasticsearch是如何实现Master选举的?
Elasticsearch的选主是ZenDiscovery模块负责的,主要包含Ping(节点之间通过这个RPC来发现彼此)和Unicast(单播模块包含⼀个主机列表以控制哪些节点需要ping通)这两部分;
对所有可以成为master的节点(node.master: true)根据nodeId字典排序,每次选举每个节点都把⾃⼰所知道节点排⼀次序,然后选出第⼀个(第0位)节点,暂且认为它是master节点。
如果对某个节点的投票数达到⼀定的值(可以成为master节点数n/2+1)并且该节点⾃⼰也选举⾃⼰,那这个节点就是master。否则重新选举⼀直到满⾜上述条件。
补充:master节点的职责主要包括集、节点和索引的管理,不负责⽂档级别的管理;data节点可以关闭http功能。
3.Elasticsearch中的节点(⽐如共20个),其中的10个选了⼀个master,另外10个选了另⼀个master,怎么办?
当集master候选数量不⼩于3个时,可以通过设置最少投票通过数量(inimum_master_nodes)超过所有候选节点⼀半以上来解决脑裂问题;
当候选数量为两个时,只能修改为唯⼀的⼀个master候选,其他作为data节点,避免脑裂问题。
4.详细描述⼀下Elasticsearch索引⽂档的过程。
协调节点默认使⽤⽂档ID参与计算(也⽀持通过routing),以便为路由提供合适的分⽚。
insertbefore未指定参照节点shard = hash(document_id) % (num_of_primary_shards)
当分⽚所在的节点接收到来⾃协调节点的请求后,会将请求写⼊到Memory Buffer,然后定时(默认是每隔1秒)写⼊到Filesystem Cache,这个从Momery Buffer到Filesystem Cache的过程就叫做refresh;
当然在某些情况下,存在Momery Buffer和Filesystem Cache的数据可能会丢失,ES是通过translog的机制来保证数据的可靠性的。其实现机制是接收到请求后,同时也会写⼊到translog中,当Filesystem cache中的数据写⼊到磁盘中时,才会清除掉,这个过程叫做flush;
在flush过程中,内存中的缓冲将被清除,内容被写⼊⼀个新段,段的fsync将创建⼀个新的提交点,并将内容刷新到磁盘,旧的translog 将被删除并开始⼀个新的translog。
flush触发的时机是定时触发(默认30分钟)或者translog变得太⼤(默认为512M)时;
5.详细描述⼀下Elasticsearch更新和删除⽂档的过程
中文base64编码删除和更新也都是写操作,但是Elasticsearch中的⽂档是不可变的,因此不能被删除或者改动以展⽰其变更;
磁盘上的每个段都有⼀个相应的.del⽂件。当删除请求发送后,⽂档并没有真的被删除,⽽是在.del⽂件中被标记为删除。该⽂档依然能匹配查询,但是会在结果中被过滤掉。当段合并时,在.del⽂件中被标记为删除的⽂档将不会被写⼊新段。
matlab破解版下载教程在新的⽂档被创建时,Elasticsearch会为该⽂档指定⼀个版本号,当执⾏更新时,旧版本的⽂档在.del⽂件中被标记为删除,新版本的⽂档被索引到⼀个新段。旧版本的⽂档依然能匹配查询,但是会在结
果中被过滤掉。
6.详细描述⼀下Elasticsearch搜索的过程
搜索被执⾏成⼀个两阶段过程,我们称之为 Query Then Fetch;
在初始查询阶段时,查询会⼴播到索引中每⼀个分⽚拷贝(主分⽚或者副本分⽚)。 每个分⽚在本地执⾏搜索并构建⼀个匹配⽂档的⼤⼩为from + size 的优先队列。PS:在搜索的时候是会查询Filesystem Cache的,但是有部分数据还在Memory Buffer,所以搜索是近实时的。
每个分⽚返回各⾃优先队列中 所有⽂档的 ID 和排序值 给协调节点,它合并这些值到⾃⼰的优先队列中来产⽣⼀个全局排序后的结果列表。
接下来就是 取回阶段,协调节点辨别出哪些⽂档需要被取回并向相关的分⽚提交多个 GET 请求。每个分⽚加载并 丰富 ⽂档,如果有需要的话,接着返回⽂档给协调节点。⼀旦所有的⽂档都被取回了,协调节点返回结果给客户端。
补充:Query Then Fetch的搜索类型在⽂档相关性打分的时候参考的是本分⽚的数据,这样在⽂档数量较少的时候可能不够准确,DFS Query Then Fetch增加了⼀个预查询的处理,询问Term和Document frequency,这个评分更准确,但是性能会变差。
9.Elasticsearch对于⼤数据量(上亿量级)的聚合如何实现?
mysql面试题34道经典 Elasticsearch 提供的⾸个近似聚合是cardinality 度量。它提供⼀个字段的基数,即该字段的distinct或者unique值的数⽬。它是基于HLL算法的。HLL 会先对我们的输⼊作哈希运算,然后根据哈希运算的结果中的 bits 做概率估算从⽽得到基数。其特点是:可配置的精度,⽤来控制内存的使⽤(更精确 = 更多内存);⼩的数据集精度是⾮常⾼的;我们可以通过配置参数,来设置去重需要的固定内存使⽤量。⽆论数千还是数⼗亿的唯⼀值,内存使⽤量只与你配置的精确度相关 .
10.在并发情况下,Elasticsearch如果保证读写⼀致?
可以通过版本号使⽤乐观并发控制,以确保新版本不会被旧版本覆盖,由应⽤层来处理具体的冲突;
另外对于写操作,⼀致性级别⽀持quorum/one/all,默认为quorum,即只有当⼤多数分⽚可⽤时才允许写操作。但即使⼤多数可⽤,也可能存在因为⽹络等原因导致写⼊副本失败,这样该副本被认为故障,分⽚将会在⼀个不同的节点上重建。
对于读操作,可以设置replication为sync(默认),这使得操作在主分⽚和副本分⽚都完成后才会返回;如果设置replication为async时,也可以通过设置搜索请求参数_preference为primary来查询主分⽚,确保⽂档是最新版本。
14.ElasticSearch中的集、节点、索引、⽂档、类型是什么?
集是⼀个或多个节点(服务器)的集合,它们共同保存您的整个数据,并提供跨所有节点的联合索引和搜索功能。集由唯⼀名称标识,默认情况下为“elasticsearch”。此名称很重要,因为如果节点设置为按名称加⼊集,则该节点只能是集的⼀部分。
节点是属于集⼀部分的单个服务器。它存储数据并参与集索引和搜索功能。
索引就像关系数据库中的“数据库”。它有⼀个定义多种类型的映射。索引是逻辑名称空间,映射到⼀个或多个主分⽚,并且可以有零个或多个副本分⽚。 MySQL =>数据库 ElasticSearch =>索引
⽂档类似于关系数据库中的⼀⾏。不同之处在于索引中的每个⽂档可以具有不同的结构(字段),但是对于通⽤字段应该具有相同的数据类型。 MySQL => Databases => Tables => Columns / Rows ElasticSearch => Indices => Types =>具有属性的⽂档
类型是索引的逻辑类别/分区,其语义完全取决于⽤户。
15.ElasticSearch中的分⽚是什么?
给交换机配置enable在⼤多数环境中,每个节点都在单独的盒⼦或虚拟机上运⾏。
索引 - 在Elasticsearch中,索引是⽂档的集合。
分⽚ -因为Elasticsearch是⼀个分布式搜索引擎,所以索引通常被分割成分布在多个节点上的被称为分⽚的元素。
问题⼀:
什么是ElasticSearch?
Elasticsearch是⼀个基于Lucene的搜索引擎。它提供了具有HTTP Web界⾯和⽆架构JSON⽂档的分布式,多租户能⼒的全⽂搜索引擎。Elasticsearch是⽤Java开发的,根据Apache许可条款作为开源发布。
问题三:
Elasticsearch中的倒排索引是什么?
倒排索引是搜索引擎的核⼼。搜索引擎的主要⽬标是在查发⽣搜索条件的⽂档时提供快速搜索。倒排索引是⼀种像数据结构⼀样的散列图,可将⽤户从单词导向⽂档或⽹页。它是搜索引擎的核⼼。其主要⽬标是快速搜索从数百万⽂件中查数据。
问题四:
ElasticSearch中的集、节点、索引、⽂档、类型是什么?
集是⼀个或多个节点(服务器)的集合,它们共同保存您的整个数据,并提供跨所有节点的联合索引和搜索功能。集由唯⼀名称标识,默认情况下为“elasticsearch”。此名称很重要,因为如果节点设置为按名称加⼊集,则该节点只能是集的⼀部分。
结构体成员的类型必须是基本数据类型节点是属于集⼀部分的单个服务器。它存储数据并参与集索引和搜索功能。
索引就像关系数据库中的“数据库”。它有⼀个定义多种类型的映射。索引是逻辑名称空间,映射到⼀个或多个主分⽚,并且可以有零个或多个副本分⽚。 MySQL =>数据库 ElasticSearch =>索引
⽂档类似于关系数据库中的⼀⾏。不同之处在于索引中的每个⽂档可以具有不同的结构(字段),但是对于通⽤字段应该具有相同的数据类型。 MySQL => Databases => Tables => Columns / Rows ElasticSearch => Indices => Types =>具有属性的⽂档
类型是索引的逻辑类别/分区,其语义完全取决于⽤户。
问题五:
ElasticSearch是否有架构?
ElasticSearch可以有⼀个架构。架构是描述⽂档类型以及如何处理⽂档的不同字段的⼀个或多个字段的描述。Elasticsearch中的架构是⼀种映射,它描述了JSON⽂档中的字段及其数据类型,以及它们应该如何在Lucene索引中进⾏索引。因此,在Elasticsearch术语中,我们通常将此模式称为“映射”。
Elasticsearch具有架构灵活的能⼒,这意味着可以在不明确提供架构的情况下索引⽂档。如果未指定映射,则默认情况下,Elasticsearch 会在索引期间检测⽂档中的新字段时动态⽣成⼀个映射。
问题六:
ElasticSearch中的分⽚是什么?
在⼤多数环境中,每个节点都在单独的盒⼦或虚拟机上运⾏。
索引 - 在Elasticsearch中,索引是⽂档的集合。
分⽚ -因为Elasticsearch是⼀个分布式搜索引擎,所以索引通常被分割成分布在多个节点上的被称为分⽚的元素。
问题七:
ElasticSearch中的副本是什么?
⼀个索引被分解成碎⽚以便于分发和扩展。副本是分⽚的副本。⼀个节点是⼀个属于⼀个集的ElasticSearch的运⾏实例。⼀个集由⼀个或多个共享相同集名称的节点组成。
问题⼋:
ElasticSearch中的分析器是什么?
在ElasticSearch中索引数据时,数据由为索引定义的Analyzer在内部进⾏转换。 分析器由⼀个Tokenizer和零个或多个TokenFilter组成。编译器可以在⼀个或多个CharFilter之前。分析模块允许您在逻辑名称下注册分析器,然后可以在映射定义或某些API中引⽤它们。
Elasticsearch附带了许多可以随时使⽤的预建分析器。或者,您可以组合内置的字符过滤器,编译器和过滤器器来创建⾃定义分析器。
问题九:
什么是ElasticSearch中的编译器?
编译器⽤于将字符串分解为术语或标记流。⼀个简单的编译器可能会将字符串拆分为任何遇到空格或标点的地⽅。Elasticsearch有许多内置标记器,可⽤于构建⾃定义分析器。
问题⼗⼀:
启⽤属性,索引和存储的⽤途是什么?
enabled属性适⽤于各类ElasticSearch特定/创建领域,如index和size。⽤户提供的字段没有“已启⽤”属性。 存储意味着数据由Lucene存储,如果询问,将返回这些数据。
存储字段不⼀定是可搜索的。默认情况下,字段不存储,但源⽂件是完整的。因为您希望使⽤默认值(这是有意义的),所以不要设置store 属性 该指数属性⽤于搜索。
索引属性只能⽤于搜索。只有索引域可以进⾏搜索。差异的原因是在分析期间对索引字段进⾏了转换,因此如果需要的话,您不能检索原始数据。
程序员的眼⾥,不⽌有代码和bug,还有诗与远⽅和妹⼦
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论