iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java面试重点中的重点之Elasticsearch核心原理
  • 147
分享到

Java面试重点中的重点之Elasticsearch核心原理

2024-04-02 19:04:59 147人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录elasticsearch简介Elasticsearch是什么?它能干什么?从核心概念开始Lucence核心数据结构DocumentIndex倒排索引FST集群相关概念节点分片总

Elasticsearch简介

Elasticsearch是什么?它能干什么?

Elasticsearch(以下称之为ES)是一款基于Lucene的分布式全文搜索引擎,擅长海量数据存储、数据分析以及全文检索查询,它是一款非常优秀的数据存储与数据分析中间件,广泛应用于日志分析以及全文检索等领域,目前很多大厂都基于Elasticsearch开发了自己的存储中间件以及数据分析平台。

从核心概念开始

Lucence

Lucene是Apache下的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,它是ES实现全文检索的核心基础,索引文档以及搜索索引的的核心流程都是在Lucene中完成的。

核心数据结构

Document

我们都说ES是面向document的,这句话什么意思呢?实际就是表示ES是基于document进行数据操作的,操作主要包括数据搜索以及索引(这里的索引时数据写入的意思)。因此可以说document是ES的基础数据结构,它会被序列化之后保存到ES中。那么这个document到底是个什么东东呢?相信大家都对Mysql还是比较熟悉的,因此我们用mysql中的数据库与表的概念与ES的index进行对比,可能并不是十分的恰当和吻合,但是可以有助于大家对于这些概念的理解。另外type也在es6.x版本之后逐渐取消了。

Index

在ES之前的版本中,是有type这个概念的,类比数据库中的表,那上文中所说的document就会放在type中。但是在ES后面的版本中为了提高数据存储的效率逐渐取消了type,因此index实际上在现在的ES中既有库的概念也有表的概念。简单理解就是index就是文档的容器,它是一类文档的集合,但是这里需要注意的是index是逻辑空间的分类,实际数据是存在物理空间的分片上的。

另外需要说明的是,在ES中索引是有不同上下文含义的,它既可以是名词也可以是动词。索引为名词是就是上文中提到的它是document的集合,索引为动词的时候表示将document数据保存到ES中,也就是数据写入。

在ES中,为了屏蔽语言的交互差异,ES直接对外的交互都是通过Rest api进行的。

倒排索引

我们都知道索引存在的意义就是为了加速数据的查询。在关系型数据库中如果没有索引的话,为了查找数据我们需要每条数据去进行比对,运气不好的话可能需要扫描全表才能查找到想要的数据。以Mysql为例,它使用了B+树作为索引来加速数据的查询。假设有这样的一种场景,周末在路上逛的时候突然听到一首非常好听的歌曲,你记住了其中两句歌词,想着赶快拿手机到QQ音乐中查一下是什么歌。如果你是QQ音乐的程序猿,你该怎么实现根据歌词查询歌曲的功能呢? 用B+树作为索引行不行呢?全文索引就是需要支持对大文本进行索引的,从空间上来说 B+ 树不适合作为全文索引,同时 B+ 树因为每次搜索都是从根节点开始往下搜索,所以会遵循最左匹配原则,而我们使用全文搜索时,往往不会遵循最左匹配原则,所以可能会导致索引失效。这时候倒排索引就派上用场了。 所谓正排索引就像书中的目录一样,根据页码查询内容,但是倒排索引确实相反的,它是通过对内容的分词,建立内容到文档ID的关联关系。这样在进行全文检索的时候,根据词典的内容便可以精确以及模糊查询,非常符合全文检索的要求。

倒排索引的结构主要包括了两大部分一个是Term Dictionary(单词词典),另一个是Posting List(倒排列表)。Term Dictionary(单词词典)记录了所用文档的单词以及单词和倒排列表的关系。Posting List(倒排列表)则是记录了term在文档中的位置以及其他信息,主要包括文档ID,词频(term在文档中出现的次数,用来计算相关性评分),位置以及偏移(实现搜索高亮)。

FST

如上文所述,在进行全文检索的时候,通过倒排索引中term与docId的关联关系获取到原始数据。但是这里有一个问题,ES底层依赖Lucene实现倒排索引的,因此在进行数据写入的时候,Lucene会为原始数据中的每个term生成对应的倒排索引,因此造成的结果就是倒排索引的数据量就会很大。而倒排索引对应的倒排表文件是存储在硬盘上的。如果每次查询都直接去磁盘中读取倒排索引数据,在通过获取的docId再去查询原始数据的话,肯定会造成多次的磁盘IO,严重影响全文检索的效率。因此我们需要一种方式可以快速定位到倒排索引中的term。大家想想使用什么方式比较好呢?可以考虑HashMap, TRIE, Binary Search Tree或者Tenary Search Tree等数据结构,实际上Lucene实际是使用了FST(Finite State Transducer)有限状态传感器来实现二级索引的设计,它其实就是一种有限状态机。

我们先来看下 trie树的结构,在Lucene中是这样做的,将倒排索引中具有公共前缀的term组成一个block,如下图所示的cool以及copy,它们拥有co的公共前缀,按照类似前缀树的逻辑来构成trie树,对应节点中携带block的首地址。我们来分析下trie树相比hashmap有什么优点?hashmap实现的是精准查找,但是trie树不仅可以实现精准查找,另外由于其公共前缀的特性还可以实现模糊查找。那我们再看trie树有什么地方可以再进行优化的地方?

如上如所示,term中的school以及cool的后面字符是一致的,因此我们可以通过将原先的trie树中的后缀字符进行合并来进一步的压缩空间。优化后的trie树就是FST。

因此通过建立FST这个二级索引,可以实现倒排索引的快速定位,不需要经过多次的磁盘IO,搜索效率大大提高了。不过需要注意的是FST是存储在堆内存中的,而且是常驻内存,大概占用50%-70%的堆内存,因此这里也是我们在生产中可以进行堆内存优化的地方。

集群相关概念

为了增强ES的数据存储可靠性以及高可用,ES支持进行集群部署,集群后的ES即便是某些节点出现故障,也不会导致真个ES集群不可用,同时通过水平扩容增强了ES的数据存储能力。

节点

所谓的节点实际就是ES的实例,我们通常在一台服务器部署一个ES实例,其实就是一个Java进程。虽然都是ES实例,但是实际上的ES集群,不同节点承担着不同的能力角色,有的是data node,主要负责保存分片的数据的,承担着数据横向扩展的重要作用,有的是coordinating node负责将用户请求进行转发以及将查询的结果进行合并返回。当然还有master节点,负责对真个集群状态进行管理和维护。

分片

单个ES节点的数据存储毕竟有限,没法实现海量数据的存储要求。那么怎么才能满足海量数据的存储要求呢?一个核心思想就是拆分,比如总共10亿条数据,如果都放在一个节点中不仅查询以及数据写入的速度回很慢,页存在单点问题。在传统关系型数据库中,采用分库分表的方式,用更多的数据库实例来承接大量的数据存储。那么在ES中,也是采取类似的设计思想,既然一个ES的实例存在数据存储的上线,那么就用多个实例来进行存储。在每个实例中存在的数据集合就是分片。如下图所示,index被切分成三个分片,三个分片分别存储在三个ES实例中,同时为了提升数据的高可用性,每个主分片都有两个副本分片,这些副本分片是主分片的数据拷贝。


put /article
{    
	"settings": {
  		"number_of_shards":3,
    	"number_of_replicas":3
  }  
}

这里需要注意的是,分片不是随意进行设定的,而是需要根据实际的生产环境提前进行数据存储的容量规划,否则分片设置的过大或者过小都会影响ES集群的整体性能。如果分片设置的过小,那么单个分片的数据量可能会很大,影响数据检索效率,也会影响数据的横向扩展。如果分片设置的过大就会影响搜索结果的数据相关性评分,影响数据检索的准确性。

总结

本文对ES的核心概念进行了全面的梳理与阐述,相信大家对于ES有了初步的了解,下篇文章中再带大家好好理解下ES的核心业务流程的原理以及优秀的设计思想,只有理解了ES的核心概念以及核心流程,那么在生产中遇到一些搜索优化、节点JVM优化等才会有对应的排查方向,另外ES中的一些优秀的设计思想,也是非常值得我们学习的,当我们在设计软件平台的时候有时可以借鉴这些优秀的设计思想。

到此这篇关于Java面试重点中的重点之Elasticsearch核心原理的文章就介绍到这了,更多相关Java Elasticsearch内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java面试重点中的重点之Elasticsearch核心原理

本文链接: https://www.lsjlt.com/news/163111.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java面试重点中的重点之Elasticsearch核心原理
    目录Elasticsearch简介Elasticsearch是什么?它能干什么?从核心概念开始Lucence核心数据结构DocumentIndex倒排索引FST集群相关概念节点分片总...
    99+
    2024-04-02
  • Java重点梳理类与对象核心原理
    目录前言一、类与对象的基本关系二、类与对象的使用1.类的定义2.对象的创建3.对象的使用4.在类定义内调用方法三、参数传递1.以变量为参数调用方法2.以数组为参数或返回值的方法调用四...
    99+
    2024-04-02
  • Java中的重要核心知识点之继承详解
    目录一、继承1、概念2、语法3、父类成员的访问(1)子类中访问父类成员变量(2)子类中访问父类成员方法4、super关键字5、子类构造方法6、super和this7、代码块执行顺序8...
    99+
    2024-04-02
  • Java ynchronized重量级锁的核心原理详解
    目录1.monitor原理2.snychronized同步代码块原理3.synchronized同步方法原理4.重量级锁的开销总结在JVM中,每个对象都关联一个监视器,这里的对象包含...
    99+
    2024-04-02
  • Android面试的重点要点题有哪些
    这篇文章给大家分享的是有关Android面试的重点要点题有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。正文整个面试题分为三个部分:Java、Android和项目经验。Java技术Java基础对抽象、继承、多...
    99+
    2023-06-04
  • 准备面试:Go和Linux的重点。
    准备面试:Go和Linux的重点 随着技术的不断发展,越来越多的公司开始采用Go语言和Linux系统。因此,成为一名优秀的Go和Linux工程师变得越来越重要。在面试中,了解这两者的关键点将帮助您成为一名更有竞争力的候选人。在本文中,我们将...
    99+
    2023-08-22
    linux 响应 面试
  • 详解Java中方法重写与重载的区别(面试高频问点)
    Java中方法重写与重载的区别 重 写 重 载 ...
    99+
    2024-04-02
  • Java面试最容易被刷的重难点之锁的使用策略
    目录一. 乐观锁和悲观锁1. 字面理解2. 生活实例3. 基于版本号方式实现乐观锁二. 读写锁1. 理解2. 用法三. 重量级锁和轻量级锁1. 原理2. 理解3. 区分用户态和内核态...
    99+
    2024-04-02
  • redis面试中常被问到的重点有哪些
    这篇文章主要讲解了“redis面试中常被问到的重点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“redis面试中常被问到的重点有哪些”吧!redis面...
    99+
    2024-04-02
  • 面试中Java接口打包问题,你需要了解的重点!
    在Java开发中,我们经常需要将接口打包成jar包,并在其他项目中引用。但是在实际操作中,很多人都会遇到一些问题,比如打包后无法引用、引用后出现异常等。本文将详细介绍Java接口打包的相关知识,以及在面试中需要了解的重点。 一、什么是接口...
    99+
    2023-11-04
    接口 打包 面试
  • Java中的ClassLoader核心知识点有哪些
    这篇文章主要介绍“Java中的ClassLoader核心知识点有哪些”,在日常操作中,相信很多人在Java中的ClassLoader核心知识点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中的C...
    99+
    2023-06-16
  • ASP、Git 和文件处理:不可忽视的面试重点
    在IT行业中,面试是获取工作机会的重要途径,而面试时的技术问题也是面试者们最为担心的问题。而ASP、Git 和文件处理这三个话题则是面试中的不可忽视的重点。这篇文章将会介绍这三个话题,并演示相应的代码。 ASP ASP,即 Active ...
    99+
    2023-08-18
    git 面试 文件
  • python面试的3大重点,让你顺利拿到
    5月已经过去大半个月了,马上就要迎来毕业季了,你准备好去面试了么?W3C咨询了不少python爬虫岗位从业者,如果你也打算从事python爬虫岗位,掌握这三个重点,能让你更顺利的get到理想的offer!1:Python因为面试的是Pyth...
    99+
    2023-01-31
    让你 顺利 重点
  • Java重点之基于比较的七大排序
    七大基于比较的排序 直接插入排序 思想:以双指针来进行遍历数组和寻找较小元素的操作,每次找到较小元素的时候就将其插入到前面的适当位置,当遍历完整个数组,并完成插入操作后,排序完成。 ...
    99+
    2024-04-02
  • 一篇文章告诉你JAVA Mybatis框架的核心原理到底有多重要
    目录持久层的那些事什么是 JDBCJDBC 原理什么是 MybatisMybatis 与 JDBC 的关系SqlSessionSqlSessionFactorySqlSessionF...
    99+
    2024-04-02
  • 文件处理是面试重点,GO语言+NumPy能否让你从面试中脱颖而出?
    文件处理是面试重点,GO语言 NumPy能否让你从面试中脱颖而出? 在现代化的数据处理中,文件操作是一个必备的技能。在面试过程中,这是一个重要的技能点。而GO语言和NumPy是两个常用的工具。那么,GO语言和NumPy是如何帮助我们在文件处...
    99+
    2023-08-25
    numpy 面试 文件
  • 分享几道关于MySQL索引的重点面试题
    前言 索引是对数据库中一或多个列值的排序,帮助数据库高效获取数据的数据结构 假如我们用类比的方法,数据库中的索引就相当于书籍中的目录一样,当我们想找到书中的摸个知识点,我们可以直接去目录中找而不是在书中每页...
    99+
    2024-04-02
  • Java数据结构之删除链表中重复的结点
    目录解析一:(不提倡)解析二:(正解)核心考点:链表操作,临界条件检查,特殊情况处理 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。...
    99+
    2024-04-02
  • Java 面向对象之继承篇详解原理与特点
    目录一、前言二、继承什么是继承呢?继承的好处与弊端继承的使用场景?继承的格式:继承的特点:重写的概念:super关键字super和this的比较一、前言 前面我也们讲述了相关封装的,...
    99+
    2024-04-02
  • 怎么掌握安卓中高级开发面试知识点?缓存重点都在这!
    前言之前早就说要整理一个集合方便大家,还好没有拖到2020年BATJ、字节跳动面试专题,算法专题,高端技术专题,混合开发专题,java面试专题,Android,Java小知识,到性能优化.线程.View.OpenCV.NDK等已经上传到了的...
    99+
    2023-06-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作