【面试宝典】69道Elasticsearch高频题库整理(附答案背诵版)
Elasticsearch是一个基于Lucene的搜索服务器,它提供了一个分布式、多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。它用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在Java、.NET(C#)、PHP、Python、Apach
简述什么是Elasticsearch?
Elasticsearch是一个基于Lucene的搜索服务器,它提供了一个分布式、多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。
它用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。
此外,Elasticsearch的主要目的是解决人们对于搜索的众多要求,它能很方便的使大量数据具有搜索、分析和探索的能力。再平衡和路由是自动完成的。
它是一个分布式、高扩展、高实时的搜索与数据分析引擎。
简述ElasticSearch对比Solr ?
Elasticsearch与Solr都是基于Lucene的开源搜索引擎,它们在功能和性能方面有一些相似之处,但也有一些区别。
分布式管理:Solr利用Zookeeper进行分布式管理,而Elasticsearch自身带有分布式协调管理功能。这意味着Solr需要额外的Zookeeper配置和管理,而Elasticsearch则更加自包含和集中管理。
数据格式支持:Solr支持更多格式的数据,如JSON、XML、CSV等,而Elasticsearch仅支持JSON文件格式。这可能对某些特定的数据格式处理更加方便,但对于通用性来说,Elasticsearch的支持性可能稍显不足。
功能丰富程度:Solr官方提供的功能更多,而Elasticsearch更注重于核心功能,高级功能多有第三方插件提供。这使得Solr在某些特定领域和特定应用场景下可能更加适合,而Elasticsearch则更注重于核心搜索功能。
实时搜索效率:Solr在传统的搜索应用中表现好于Elasticsearch,但在处理实时搜索应用时效率明显低于Elasticsearch。Elasticsearch完全支持ApacheLucene的接近实时的搜索,使其在处理实时数据时具有更高的效率。
总的来说,Elasticsearch和Solr都有各自的优点和适用场景。如果需要处理复杂的搜索场景、需要分布式协调管理功能、或者需要实时搜索功能,Elasticsearch可能更合适。如果需要处理更多格式的数据、或者需要使用Solr提供的更多高级功能,那么Solr可能更合适。
Elasticsearch 什么是正向索引?什么是倒排索引?
正向索引(Forward Index)和倒排索引(Inverted Index)都是搜索引擎中常见的索引方式,它们在组织和查找数据时有所不同。
- 正向索引:以文档的ID为关键字,表中记录文档中每个字的位置信息。在查找时,扫描每个文档中字的信息,直到找出包含查询关键字的文档。这种索引方式在建立索引时结构简单,建立方便且易于维护。如果新的文档加入,只需要为该文档建立一个新索引块,并挂接在原来索引文件的后面。
- 倒排索引:以字或词为关键字进行索引,表中关键字所对应的记录表项记录了出现这个字或词的所有文档。在搜索引擎中,用户输入一个查询词,倒排索引可以快速找到包含该查询词的文档。相比正向索引,倒排索引更加适用于快速查找包含特定词汇的文档。
总之,正向索引和倒排索引是两种不同的索引方式,它们在组织和查找数据时有所不同。在搜索引擎中,倒排索引被广泛使用,因为它可以快速找到包含特定词汇的文档。
简述ElasticSearch的数据模型核心概念?
Elasticsearch的数据模型核心概念主要包括以下几个方面:
- 索引(Index):Elasticsearch中的索引是一个具有相似结构的文档集合。它类似于关系型数据库中的数据库概念,用于组织和存储相关数据。每个索引都有一组文档,这些文档在结构和数据类型上具有相似性。
- 文档(Document):在Elasticsearch中,文档是一个可被索引的基础信息单元,它以JSON格式表示。文档是构成索引的基本单元,每个文档代表一个实体或对象,并包含了一组字段(Field),用于存储和表示实体的属性和关系。
- 字段(Field):字段是文档中的数据字段,类似于关系型数据库中的列。每个字段都有其特定的数据类型和属性,用于定义数据的结构和约束。在Elasticsearch中,字段可以是嵌套的,以支持复杂的数据结构。
- 映射(Mapping):映射是Elasticsearch中的一种数据结构,它定义了如何处理和索引文档中的数据。映射可以定义字段的数据类型、分析器、默认值等属性,以及是否需要对其进行索引。
- 分片(Shards):由于一个索引可能包含大量的数据,单节点的存储可能会受到硬件的限制。因此,Elasticsearch将索引数据拆分成多个分片,每个分片存储在不同的服务器节点上,以提供统一的分布式服务。这些分片合在一起构成了完整的索引数据。
这些核心概念构成了Elasticsearch的数据模型,使得它能够高效地处理大规模的搜索和分析任务。
详细描述 Elasticsearch 搜索的过程?
Elasticsearch的搜索过程可以分为以下几个步骤:
- 查询(Query)阶段:当一个搜索请求发出时,这个查询会被广播到索引中的每一个分片(主分片或副本分片)。每个分片在本地执行查询请求后生成一个命中文档的优先级队列。这个队列是一个排序好的top N数据的列表,它的size等于from+size的和。每个分片返回各自优先队列中所有文档的ID和排序值给协调节点。
- 取回(Fetch)阶段:协调节点辨别出哪些文档需要被取回并向相关的分片提交多个GET请求。每个分片加载并丰富文档,如果有需要的话,接着返回文档给协调节点。一旦所有的文档都被取回,协调节点返回结果给客户端。
在搜索的时候,Elasticsearch会查询Filesystem Cache,但有部分数据还在MemoryBuffer,所以搜索是近实时的。
Elasticsearch 是如何实现Master选举的 ?
Elasticsearch使用ZooKeeper来协调各个节点之间的Master选举。当一个节点启动时,它会向ZooKeeper发送一个包含自己IP地址和端口号的消息,表示自己可以成为Master节点。
在ZooKeeper中,每个节点都有一个相应的条目,记录着该节点的IP地址和端口号等信息。当一个节点启动时,它会检查ZooKeeper中是否存在与自己相同的条目,如果存在,说明已经有其他节点成为了Master节点,那么该节点就会成为该Master节点的副本节点。
如果一个节点在一段时间内没有收到来自Master节点的消息,它会认为Master节点已经失效,然后开始进行Master选举。在选举过程中,每个节点都会将自己的ID和当前时间戳发送给其他节点,其他节点会根据收到消息的时间戳来判断哪个节点应该成为新的Master节点。
当一个节点被选为Master节点后,它会向ZooKeeper发送一个消息,表示自己成为了Master节点。其他节点在收到这个消息后,会更新自己的状态,成为该Master节点的副本节点。
需要注意的是,Elasticsearch的Master选举是基于Paxos算法实现的,该算法可以保证在多个节点之间进行一致性的选择,避免出现脑裂等问题。
详细描述Elasticsearch索引⽂档的过程?
Elasticsearch索引文档的过程可以分为以下几个步骤:
-
接收请求:Elasticsearch接收到一个索引文档的请求,该请求包含要索引的文档内容和相关的索引名称等信息。
-
解析文档:Elasticsearch对请求中的文档内容进行解析,将其转化为索引所需的内部格式。这个过程包括对文档进行分词、去停用词、词干化等处理,以便于后续的搜索和分析。
-
创建索引:根据请求中的索引名称等信息,Elasticsearch创建一个新的索引或更新已存在的索引。在这个过程中,Elasticsearch会根据配置的映射规则对文档进行规范化和处理。
-
写入索引:将经过解析和规范化的文档数据写入到Elasticsearch的索引中。这个过程可能会涉及到数据的排序、去重、压缩等处理,以提高存储和搜索效率。
-
返回结果:一旦文档被成功写入到索引中,Elasticsearch会返回一个响应,包含写入文档的相关信息,如文档ID、版本号等。
需要注意的是,Elasticsearch的索引文档过程是实时的,即当新文档被索引时,它可以在秒级别的时间内被搜索到。此外,Elasticsearch还提供了丰富的API和功能来支持对索引文档的过程进行更加灵活的控制和操作。
ES中match和term差别对比,text和keyword区别、bool查询?
match和term是Elasticsearch中的两种查询方式,它们的主要区别在于查询的精度和范围。
match查询是一种全文查询方式,它基于文档的全文内容进行匹配,可以匹配单词、短语、句子等。match查询会考虑单词的同义词、词性变化、单复数形式等,因此它适用于进行全文搜索和模糊匹配。
term查询是一种精确查询方式,它只匹配指定的单词或短语,不考虑单词的同义词、词性变化、单复数形式等。term查询适用于进行精确匹配和过滤操作。
text和keyword是Elasticsearch中的两种字段类型,它们的主要区别在于对文本的处理方式和搜索方式。
text类型是一种全文字段类型,它会对文本进行分词、去停用词、词干化等处理,以提高搜索的准确性和效率。text类型适用于进行全文搜索和模糊匹配。
keyword类型是一种字符串字段类型,它不对文本进行任何处理,保留原始的文本内容和格式。keyword类型适用于进行精确匹配和过滤操作,如对URL、邮件地址、主机名等进行匹配。
bool查询是Elasticsearch中的一种复合查询方式,它可以将多个查询条件组合在一起,并指定它们之间的逻辑关系。bool查询可以包含多个子查询,每个子查询可以是match、term、range等查询方式,它们之间可以使用AND、OR、NOT等逻辑运算符进行组合。bool查询适用于进行复杂的逻辑组合和精确匹配操作。
阐述Elasticsearch如何确保数据一致性 ?
Elasticsearch通过以下几种方式来确保数据一致性:
- 乐观锁:Elasticsearch在处理文档时,会检查文档的版本号。当多个请求同时对同一文档进行操作时,版本号会发生变化。如果版本号不一致,Elasticsearch会拒绝执行操作并返回错误。这确保了同一文档在多个请求之间的操作具有原子性,从而保持数据一致性。
- 序列号处理:Elasticsearch使用文档的序列号来保证数据一致性。每当文档被修改时,它的序列号会发生变化。如果多个请求同时修改同一文档,Elasticsearch会根据序列号来确定操作的顺序,从而避免冲突。
- 分布式协调:Elasticsearch是一个分布式搜索引擎,它需要在多个节点之间进行数据同步和协调。为了确保数据一致性,Elasticsearch使用了分布式协调机制,当一个节点发生故障时,其他节点可以接管它的任务,并保证数据的完整性和一致性。
- 版本控制:Elasticsearch支持版本控制,可以记录每个文档的版本号和修改历史。这使得在多个版本之间进行切换和合并变得容易,同时保证了数据的一致性和可追溯性。
- 复制策略:Elasticsearch中的索引可以设置备份和复制策略,以确保数据的安全性和一致性。当主索引发生故障时,备份索引可以接管任务,并保证数据的可用性和一致性。
综上所述,Elasticsearch通过乐观锁、序列号处理、分布式协调、版本控制和复制策略等多种方式来确保数据一致性。
ElasticSearch vs Lucene的关系 ?
Elasticsearch和Lucene之间存在密切的关系。Elasticsearch构建于Lucene搜索引擎库的基础上,利用Lucene提供的全文搜索和索引功能,并在此基础之上进行了扩展,提供了更多高级功能,如分布式性能、实时数据索引、聚合分析、RESTful API等。
具体来说,Lucene是Elasticsearch的底层核心,提供了基本的搜索和索引功能。然而,Lucene本身是一个原始的搜索库,需要开发者自行进行二次开发才能使用。相比之下,Elasticsearch对Lucene进行了封装和优化,使得开发者能够更方便地使用其搜索和分析功能,而无需深入了解Lucene的复杂性。
此外,Elasticsearch还提供了更高级的搜索和分析功能,包括对JSON文档的存储、分布式架构、复杂查询语言和实时索引的支持。这些功能使得Elasticsearch在处理大规模数据和高并发请求时具有显著优势。
综上所述,Elasticsearch是Lucene的扩展和封装,提供了更多高级功能,使得开发者能够更方便地构建搜索和分析应用。
简述Elasticsearch中文分词 ?
Elasticsearch中的中文分词是其自然语言处理中的基础环节之一。在进行中文文本分析时,由于中文词语之间没有明显的区分标记,因此需要先将中文文本切分成合理的词语序列,然后再进行其它分析处理。
在Elasticsearch中,中文分词主要通过以下几种方式实现:
- 基于词典的分词算法:Elasticsearch内置了一些常用的词典,如IK Analyzer、Smart Chinese Analyzer等,这些词典包含了大量的中文字符和词语信息。在进行中文分词时,Elasticsearch会根据预先设置的词典,将输入的文本切分成一个个独立的词语。这种分词方法速度快,实现简单,但效果可能受到词典的限制。
- 基于统计的机器学习算法:Elasticsearch还支持使用机器学习算法进行中文分词,如HMM、CRF、SVM等。这些算法通过训练大量的中文文本数据,学习词语出现的频率和上下文关系,从而实现对中文文本的自动分词。这种分词方法对未登录词和歧义词的处理效果较好,但需要大量的人工标注数据和较慢的分词速度。
无论采用哪种分词方法,Elasticsearch都提供了丰富的API和功能来支持中文分词,如分词结果展示、分词位置信息等。同时,用户还可以根据自己的需求自定义分词器,以满足特定的中文文本处理需求。
Elasticsearch 中的节点(比如共 20 个),其中的 10 个选了一个 master,另外 10 个选了另一个 master,怎么办?
这种情况可能是由于网络分区或配置问题导致的。如果10个节点选了一个master,另外10个节点选了另一个master,首先需要确认这是否是预期的行为。如果是,那么Elasticsearch将在这两个master节点之间进行数据复制,确保数据的一致性。
但是,这种情况通常是不正常的。在正常情况下,所有的Elasticsearch节点都应该选择相同的master节点。如果出现了这种情况,可以尝试以下解决方案:
- 检查网络连接:确保所有节点之间的网络连接正常,没有网络分区或故障。
- 检查节点配置:确保所有节点的Elasticsearch配置文件正确,并且指向正确的网络地址和端口。
- 重启节点:尝试重启有问题的节点,以清除任何错误的配置或状态。
- 重新加入节点:如果问题仍然存在,可以尝试从集群中移除有问题的节点,然后重新加入。
如果以上步骤都不能解决问题,那么可能需要检查更深入的问题,例如Elasticsearch版本兼容性问题、硬件故障等。在这种情况下,建议查看Elasticsearch的日志文件以获取更多错误信息,并参考Elasticsearch的官方文档或社区寻求进一步的帮助。
Elasticsearch 客户端在和集群连接时,如何选择特定的节点执行请求的?
Elasticsearch客户端在连接集群并执行请求时,会使用一种称为"round-robin"的负载均衡机制来选择特定的节点执行请求。
当客户端向Elasticsearch集群发送请求时,它会首先与集群中的所有节点建立连接。然后,客户端会按照一个循环顺序向这些节点发送请求。每个请求都会被发送到一个不同的节点,直到所有的节点都执行过请求。然后,客户端会回到第一个节点,重新开始这个过程。这种方式确保了每个节点都会收到相同数量的请求,从而均衡了负载。
然而,这只是默认的行为。在Elasticsearch中,你还可以通过配置路由或者使用特定的路由API来将请求发送到特定的节点。例如,你可以使用路由参数来指定一个特定的节点,或者使用"一致性哈希"路由策略来将请求发送到具有特定数据的节点。
此外,Elasticsearch还提供了许多其他的功能和配置选项来优化和定制集群的性能和行为,例如使用路由、数据分片和复制等。
详细描述Elasticsearch 更新和删除文档的过程?
在Elasticsearch中,更新和删除文档的过程涉及到对索引和段文件的修改。以下是详细的过程:
更新文档:
- 当一个更新请求到达Elasticsearch时,它首先被路由到一个主分片上。
- Elasticsearch会根据文档的ID获取到对应的版本号,并检查该版本号是否与当前文档的版本号一致。如果一致,更新操作会被执行;如果不一致,则会返回一个版本冲突错误。
- 在执行更新操作时,Elasticsearch会创建一个新的段文件来存储更新后的文档内容。同时,它还会为该文档指定一个新的版本号。
- 当段文件被创建后,Elasticsearch会将其合并到现有的段文件中。在这个过程中,旧版本的文档在.del文件中被标记为删除,新版本的文档被索引到一个新的段中。
- Elasticsearch还会在索引的映射中更新文档的元数据信息,例如更新时间戳等。
删除文档:
- 当一个删除请求到达Elasticsearch时,它首先被路由到一个主分片上。
- Elasticsearch会根据文档的ID获取到对应的版本号,并检查该版本号是否与当前文档的版本号一致。如果一致,删除操作会被执行;如果不一致,则会返回一个版本冲突错误。
- 在执行删除操作时,Elasticsearch会在.del文件中标记要删除的文档。这个文档仍然能匹配查询,但是会在结果中被过滤掉。
- 当段合并时,被标记为删除的文档不会被写入新的段中。
- Elasticsearch还会在索引的映射中删除文档的元数据信息,例如删除时间戳等。
需要注意的是,Elasticsearch中的文档是不可变的,因此更新和删除操作并不是真正意义上的修改或删除文档,而是通过标记和合并段文件的方式来达到更新和删除的效果。同时,由于Elasticsearch是分布式的,更新和删除操作可能会涉及到多个节点的协作和数据复制,因此需要保证操作的原子性和一致性。
Elasticsearch 对于大数据量(上亿量级)的聚合如何实现?
Elasticsearch 对于大数据量的聚合操作主要通过以下几种方式实现:
- 桶化(Bucketization): 桶化是一种将大量数据划分为多个桶的技术,每个桶包含一组具有共同特征的数据。通过将数据划分为桶,可以减少需要处理的数据量,从而加快聚合速度。在 Elasticsearch 中,可以使用聚合(Aggregations)功能来进行桶化操作。
- 分页(Paging): 对于大量数据的聚合操作,可以通过分页技术将数据分批次处理。Elasticsearch 支持通过使用
from
和size
参数来指定每批次返回的数据量。通过逐步获取批次数据并处理,可以减少一次性处理的数据量。 - 使用更少的字段: 对于大数据量的聚合操作,可以考虑只使用必要的字段,以减少数据的大小和处理的复杂性。
- 分布式处理: Elasticsearch 是分布式搜索引擎,可以轻松地扩展到多个节点。通过增加节点数量并使用分布式处理,可以加快大数据量的聚合速度。
- 优化查询: 通过优化查询语句和索引设置,可以提高查询性能和聚合速度。例如,使用合适的查询语句、优化索引结构、启用压缩等。
- 使用更新的 Elasticsearch 版本: 随着版本的更新,Elasticsearch 不断优化性能和功能。考虑升级到最新的稳定版本,以获得更好的聚合性能。
- 硬件优化: 通过使用更快的硬件设备(例如高内存和高 CPU 的服务器),可以加快大数据量的聚合速度。
- 使用第三方工具或库: 有一些第三方工具或库可以帮助优化 Elasticsearch 的聚合性能,例如使用 Elasticsearch 的 Java API 进行聚合操作时,可以使用一些优化库来提高性能。
需要注意的是,对于大数据量的聚合操作,可能需要综合考虑以上多种方法来达到最佳效果。同时,根据具体的数据特性和业务需求,可能还需要进行额外的优化和调整。
简述Elasticsearch 数据类型?
Elasticsearch的数据类型主要包括以下几种:
- text:这是全文搜索类型,它会对一个字符串进行分词,然后可以通过单个词搜索到对应的数据。然而,text类型不能用于排序或者聚合等操作。如果想要全文分词搜索又要排序或者聚合,可以和keyword一起构建多元字段类型。
- keyword:这是精确检测类型,通常用于过滤、聚合、排序等操作。
- long:64位的integer,32位的short,范围为[-32768, 32767],byte为8位,范围[-128, 127],float为32位,double为64位。建议根据字段的具体范围确定类型,这样可以节省空间和查询效率。
- array:在Elasticsearch中并没有专门的数据类型用于表示数组,例如text和keyword都可以直接存入数组数据中,数组中的每个元素都拥有text或者keyword的属性。在接口查询时也没有直接数组的接口,使用方法与text或者keyword一样。
由于内容太多,更多内容以链接形势给大家,点击进去就是答案了
18. Elasticsearch 读取数据(文档)的过程?
20. 解释 Elasticsearch 中的相关性和得分?
21. 在Elasticsearch中 按 ID检索文档的语法是什么?
22. Elasticsearch 中列出集群的所有索引的语法是什么?
27. 简单阐述Elasticsearch Cluster?
29. 安装 Elasticsearch 需要依赖什么组件吗?
30. REST API在 Elasticsearch 方面有哪些优势?
31. Elasticsearch在部署时,对Linux的设置有哪些优化方法?
33. 简述ElasticSearch 分片数量?副本数量的设定 ?
34. ElasticSearch JVM 调优?调整哪些参数?
36. 简述Elasticsearch出现脑裂的原因?如何解决?
37. Elasticsearch 中执行搜索的各种可能方式有哪些?
39. ElasticSearch 精准匹配检索和全文检索匹配检索的不同?
41. Elasticsearch 中的数据存储流程简述 ?
42. 请列出 Elasticsearch 各种类型的分析器 ?
43. 简述如何使用 Elasticsearch Tokenizer?
44. 简述Token filter 过滤器 在 Elasticsearch 中如何工作?
45. Master 节点和 候选 Master节点有什么区别?
46. 简述Elasticsearch中的属性 enabled, index 和 store 的功能?
47. Elasticsearch Analyzer 中的字符过滤器如何利用?
50. 解释一下X-Pack for Elasticsearch的功能?
51. 简述Elasticsearch中 cat API的功能?
52. 描述Elasticsearch 中常用的 cat命令有哪些?
54. Kibana在Elasticsearch的哪些地方以及如何使用?
55. Logstash 如何与 Elasticsearch 结合使用?
56. Beats 如何与 Elasticsearch 结合使用?
58. 对于GC方面,在使用Elasticsearch时要注意什么?
63. 简述Elasticsearch(ES)配置及优化措施 ?
65. 如何修改Elasticsearch最大返回结果数 ?
更多推荐
所有评论(0)