ES面试题及答案(最常见19道必考题)

ES面试题及答案(最常见19道必考题)-mikechen

ElasticSearch是Java面试经常问到的内容,今天给大家总结了常见的ElasticSearch面试题及答案@mikechen

什么是ElasticSearch?

ElasticSearch是一个开源的分布式搜索和分析引擎,基于Lucene库构建而成。

 

ElasticSearch的特点?

  • 分布式架构:ElasticSearch能够水平扩展,将数据分布在多个节点上,实现高吞吐量和可伸缩性。
  • 实时性:数据被索引后几乎立即可供搜索和分析。
  • 多种查询类型:支持全文搜索、精确匹配、模糊查询、范围查询等多种查询方式。
  • 高亮显示:能够标记搜索结果中匹配的关键字,提升用户体验。
  • 强大的聚合功能:支持各种聚合操作,如统计、分组、求和、平均值等。
  • 全文检索和分析:支持对结构化和非结构化数据进行全文搜索和复杂的数据分析。

 

ElasticSearch的应用场景?

1)全文搜索的功能

ElasticSearch以其强大的全文搜索功能而闻名,适用于构建各种搜索引擎应用。

它可以应用于电子商务网站、新闻聚合网站、论坛社区、文档管理系统等需要快速、准确搜索的场景。

2)日志分析

ElasticSearch可以用于集中存储和分析分布式应用程序的日志和追踪数据。

3) 数据挖掘和机器学习

ElasticSearch结合机器学习工具,如Kibana、Logstash和Beats(ELK堆栈),可以用于数据挖掘、实时监控和异常检测等应用。

4)安全分析

当您需要通过日志解决公司内部繁杂的安全审计工作,可通过Elasticsearch分析、检索海量历史日志,高效地完成安全审计工作。

 

ElasticSearch与关系型数据库相比较?

与传统关系型数据库相比,ElasticSearch有以下几个区别:

  • 数据模型:ElasticSearch是面向文档的,每个文档是一个自包含的实体,可以是JSON、XML等格式。而关系型数据库使用表格和行来组织数据。
  • 查询语言:ElasticSearch使用基于RESTful API的查询语言,结构清晰、易于理解,而关系型数据库使用SQL语言。
  • 分布式性能:ElasticSearch具备水平扩展的能力,可以将数据分散存储在多个节点上,实现更好的性能和可伸缩性。而关系型数据库通常在单个服务器上运行,难以进行横向扩展。
  • 复杂的搜索和分析功能:ElasticSearch提供丰富的全文搜索、聚合和分析功能,支持高级查询和数据分析,而关系型数据库的搜索功能相对较弱。

 

Elasticsearch 的基本概念?

1.索引(Index)

索引是一个逻辑容器,用于存储和组织一类具有相似特征的文档。每个索引都有一个唯一的名称,并包含了相关文档的倒排索引和元数据。

2.文档(Document)

文档是Elasticsearch的基本数据单元,以JSON格式表示。每个文档在索引中都有一个唯一的标识符(ID),并且属于一个特定的索引。文档可以包含各种类型的数据,如文本、数字、日期等。

3.类型(Type)

在较早的版本中,Elasticsearch引入了类型的概念,用于对索引中的文档进行分类。但自Elasticsearch 7.0版本开始,类型已被弃用,一个索引只能包含一个默认类型”_doc”。

4.分片(Shard)

索引可以被划分成多个分片,每个分片是一个独立的索引单元。分片允许数据在集群中分布式存储和处理,提高了性能和可扩展性。分片可以水平扩展和并行处理数据。

5.副本(Replica)

每个分片可以有零个或多个副本。副本是分片的复制,用于提供数据冗余和高可用性。副本可以分布在不同的节点上,提供数据的备份和故障恢复能力。

6.节点(Node)

节点是Elasticsearch集群中的一个服务器实例,可以存储和处理数据。节点具有唯一的名称,并且可以承担多个角色,如主节点、数据节点、协调节点等。

7.集群(Cluster)

集群由多个节点组成,共同协作以提供高可用性和可伸缩性。集群有一个唯一的名称,并且具有一个主节点(Master Node),负责协调整个集群的操作。

 

如何在 ElasticSearch 中执行搜索操作?

在 ElasticSearch 中,可以使用查询语句(Query DSL)执行搜索操作。

Query DSL是一种基于JSON的领域特定语言,用于构建查询语句。

常见的搜索操作包括:全文搜索、精确匹配、模糊查询、范围查询等。

例如,使用match查询进行全文搜索,使用term查询进行精确匹配,使用wildcard查询进行模糊查询,使用range查询进行范围查询等。

 

ElasticSearch中的分析器是什么?

在ElasticSearch中,分析器(Analyzer)是一个用于处理文本的组件,它在将文本数据索引之前对其进行分词(Tokenization)和标准化(Normalization)。

分析器由以下两个主要组件组成:

  1. 分词器(Tokenizer):分词器将文本划分为一个个独立的词(或称为标记,Tokens),根据特定的规则进行切分。常见的分词器包括标准分词器(Standard Tokenizer)、简单分词器(Simple Tokenizer)、空格分词器(Whitespace Tokenizer)等。
  2. 词条过滤器(Token Filters):词条过滤器对分词后的词进行处理,例如删除停用词(Stop Words)、转换为小写、词干提取(Stemming)、同义词扩展等。词条过滤器可以按需组合使用,以满足具体的需求。常见的词条过滤器包括停用词过滤器(Stop Token Filter)、小写化过滤器(Lowercase Token Filter)、词干过滤器(Stemmer Token Filter)等。

 

Elasticsearch 索引文档的过程?

面试官想考察你的是:文档写入 ES创建索引的过程。

文档写入包含:单文档写入和批量bulk写入,这里只解释一下单文档写入流程。

大致分为如下三步:

ES面试题及答案(最常见19道必考题)-mikechen

第一步:客户从集群某节点写入数据,发送请求。

第二步:节点 1 接受到请求后,使用文档_id 来确定文档属于分片 0。而分片0属于节点3,请求会被转到节点 3。分片 0 的主分片也分配到节点 3 上;

第三步:节点 3 在主分片上执行写操作,成功后将请求并行转发到节点1和节点 2 的副本分片上。所有的副本分片都报告成功,节点3将向协调节点(节点 1)报告成功,节点 1 向请求客户端报告写入成功。

 

ElasticSearch的搜索流程?

搜索被执行成一个两阶段过程:

第一个阶段:Query阶段

客户端发送请求到 coordinate node,协调节点将搜索请求广播到所有的 primary shard 或 replica,每个分片在本地执行搜索并构建一个匹配文档的大小为 from + size 的优先队列。接着每个分片返回各自优先队列中 所有 docId 和 打分值 给协调节点,由协调节点进行数据的合并、排序、分页等操作,产出最终结果。

第二个阶段:Fetch阶段

协调节点根据 Query阶段产生的结果,去各个节点上查询 docId 实际的 document 内容,最后由协调节点返回结果给客户端。

 

ElasticSearch中的倒排索引是什么?

倒排索引是 ElasticSearch 中的核心概念,用于实现快速的全文搜索。

它是一种将文档中的每个词映射到包含该词的文档的数据结构。通过倒排索引,可以快速确定包含特定词的文档。

倒排索引是区别于正排索引的概念:

正排索引:是以文档对象的唯一 ID 作为索引,以文档内容作为记录。

倒排索引:Inverted index,指的是将文档内容中的单词作为索引,将包含该词的文档 ID 作为记录。

ES面试题及答案(最常见19道必考题)-mikechen

 

Elasticsearch 支持哪些类型的查询?

包括:

  • match查询:用于执行全文搜索,基于查询文本与字段内容的相关性进行匹配。
  • term查询:用于精确匹配字段的值,不进行分词。
  • range查询:用于匹配在某个范围内查询。

 

Elasticsearch 中的数据存储功能吗?

Elasticsearch是一个搜索引擎,输入写入ES的过程就是索引化的过程,数据按照既定的 Mapping 序列化为Json 文档实现存储。

 

解释一下Elasticsearch Cluster?

Elasticsearch 集群是一组连接在一起的一个或多个 Elasticsearch 节点实例。

Elasticsearch 集群的功能在于在集群中的所有节点之间分配任务,进行搜索和建立索引。

 

解释一下 Elasticsearch 的 分片?

当文档数量增加,硬盘容量和处理能力不足时,对客户端请求的响应将延迟。

在这种情况下,将索引数据分成小块的过程称为分片,可改善数据搜索结果的获取。

 

Elasticsearch 中执行搜索的各种可能方式有哪些?

方式一:基于 DSL 检索(最常用) Elasticsearch提供基于JSON的完整查询DSL来定义查询。

GET /shirts/_search
{
  "query": {
    "bool": {
      "filter": [
        { "term": { "color": "red"   }},
        { "term": { "brand": "gucci" }}
      ]
    }
  }
}

方式二:基于 URL 检索

GET /my_index/_search?q=user:seina

方式三:类SQL 检索

POST /_sql?format=txt
{
  "query": "SELECT * FROM uint-2020-08-17 ORDER BY itemid DESC LIMIT 5"
}

 

ElasticSearch如何实现 master 选举的?

在Elasticsearch中,Master节点的选举是通过内部的分布式协调机制来实现的。

当一个Elasticsearch集群启动或发生Master节点故障时,集群中的节点会自动进行Master节点选举,确保集群的正常运行。

以下是Master节点选举的基本过程:

  1. 启动阶段:当Elasticsearch集群中的节点启动时,它们会互相发现,并尝试建立连接。在集群中的每个节点都有一个唯一的节点名称,可以在配置文件或命令行参数中指定。在启动时,节点会尝试成为Master候选节点。
  2. Master候选节点选举:当节点启动后,它们会通过内部的选举算法进行Master候选节点的选举。在这个过程中,节点会比较彼此的节点名称和优先级,并基于一定的规则选择出一个节点作为Master候选节点。
  3. Master节点选举结果:选举完成后,集群中的节点将达成一致,决定哪个节点将成为Master节点。选举结果会被广播给集群中的所有节点。
  4. Master节点失效处理:如果当前的Master节点失效(如宕机或网络故障),其他节点会重新触发选举过程,选择新的Master节点来接替失效的角色。

 

Elasticsearch 更新和删除文档的过程?

在Elasticsearch中,更新和删除文档的过程涉及以下几个步骤:

  1. 更新文档:
    • 客户端发送更新请求(Update Request)给Elasticsearch集群,指定要更新的文档ID和更新的内容。
    • Elasticsearch接收到请求后,首先检查文档是否存在。如果文档存在,它会将更新的内容与原始文档进行合并。
    • 合并后的文档被写入索引的事务日志(translog)中,以确保数据的持久性。
    • 更新后的文档被写入相应的分片中,并根据需要进行副本同步。
    • 客户端收到响应,确认文档已成功更新。
  2. 删除文档:
    • 客户端发送删除请求(Delete Request)给Elasticsearch集群,指定要删除的文档ID。
    • Elasticsearch接收到请求后,检查文档是否存在。如果文档存在,它会将删除操作写入索引的事务日志(translog)中。
    • 删除操作会被应用到相应的分片中,并根据需要进行副本同步。
    • 客户端收到响应,确认文档已成功删除。

 

Elasticsearch高并发下如何保证读写一致性?

在Elasticsearch中,读写一致性是通过以下机制来保证的:

1.分片级别的一致性

Elasticsearch将索引分成多个分片,每个分片都是一个独立的工作单元。

写入操作先写入主分片,然后通过副本同步到其他副本分片。在写入完成之前,读取操作会优先读取主分片的数据,确保读写操作的一致性。

2.写入刷新(Write Refresh)

当一个文档被写入主分片后,Elasticsearch并不立即将其刷新到磁盘上。

相反,它将写入操作追加到事务日志(translog)中,并在适当的时机进行刷,。这种方式下,写入操作在内存中完成,提供了较高的写入性能。

3.索引刷新(Index Refresh)

为了确保数据的一致性和可搜索性,Elasticsearch会定期或手动执行索引刷新操作。

索引刷新会将内存中的数据写入磁盘,并更新搜索的视图。

默认情况下,索引刷新每隔1秒自动执行一次,但可以根据需要进行调整。

4.同步写入(Synced Flush)

在某些情况下,需要确保写入的数据立即刷新到磁盘,以确保持久性和一致性。

可以使用同步写入(synced flush)操作,它会阻塞写入操作,直到数据完全写入磁盘。

同步写入操作会增加写入的延迟,但可以提供更强的一致性保证。

 

ElasticSearch索引多了怎么办,如何调优部署?

1)在设计的时候可以基于模板+时间滚动方式创建索引,每天递增数据,避免单个索引很大的情况出现;

2)在存储的时候冷热数据分开存储,比如最近3天的数据作为热数据,其他的作为冷数据。冷数据的话由于不会再写入新数据了,可以考虑定期force_merge(强制合并)和shrink(压缩)的方式进行处理,节约空间和检索效率。

3)由于es支持动态扩展,所有可以多加几台机器来缓解集群压力。

mikechen

mikechen睿哥,10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获知最新一线技术干货!

评论交流
    说说你的看法