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)。
分析器由以下两个主要组件组成:
- 分词器(Tokenizer):分词器将文本划分为一个个独立的词(或称为标记,Tokens),根据特定的规则进行切分。常见的分词器包括标准分词器(Standard Tokenizer)、简单分词器(Simple Tokenizer)、空格分词器(Whitespace Tokenizer)等。
- 词条过滤器(Token Filters):词条过滤器对分词后的词进行处理,例如删除停用词(Stop Words)、转换为小写、词干提取(Stemming)、同义词扩展等。词条过滤器可以按需组合使用,以满足具体的需求。常见的词条过滤器包括停用词过滤器(Stop Token Filter)、小写化过滤器(Lowercase Token Filter)、词干过滤器(Stemmer Token Filter)等。
Elasticsearch 索引文档的过程?
面试官想考察你的是:文档写入 ES创建索引的过程。
文档写入包含:单文档写入和批量bulk写入,这里只解释一下单文档写入流程。
大致分为如下三步:
第一步:客户从集群某节点写入数据,发送请求。
第二步:节点 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 作为记录。
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节点选举的基本过程:
- 启动阶段:当Elasticsearch集群中的节点启动时,它们会互相发现,并尝试建立连接。在集群中的每个节点都有一个唯一的节点名称,可以在配置文件或命令行参数中指定。在启动时,节点会尝试成为Master候选节点。
- Master候选节点选举:当节点启动后,它们会通过内部的选举算法进行Master候选节点的选举。在这个过程中,节点会比较彼此的节点名称和优先级,并基于一定的规则选择出一个节点作为Master候选节点。
- Master节点选举结果:选举完成后,集群中的节点将达成一致,决定哪个节点将成为Master节点。选举结果会被广播给集群中的所有节点。
- Master节点失效处理:如果当前的Master节点失效(如宕机或网络故障),其他节点会重新触发选举过程,选择新的Master节点来接替失效的角色。
Elasticsearch 更新和删除文档的过程?
在Elasticsearch中,更新和删除文档的过程涉及以下几个步骤:
- 更新文档:
- 客户端发送更新请求(Update Request)给Elasticsearch集群,指定要更新的文档ID和更新的内容。
- Elasticsearch接收到请求后,首先检查文档是否存在。如果文档存在,它会将更新的内容与原始文档进行合并。
- 合并后的文档被写入索引的事务日志(translog)中,以确保数据的持久性。
- 更新后的文档被写入相应的分片中,并根据需要进行副本同步。
- 客户端收到响应,确认文档已成功更新。
- 删除文档:
- 客户端发送删除请求(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」公众号,获知最新一线技术干货!
