【编程二三事】ES究竟是个啥?

在最近的项目中,总是或多或少接触到了搜索的能力。而在这些项目之中,或多或少都离不开一个中间件 - ElasticSearch。
今天忙里偷闲,就来好好了解下这个中间件是用来干什么的。

ES是什么?

​ ES全称ElasticSearch,是个基于Lucene的搜索服务器。其作为一个高度可拓展的开源全文搜索和分析引擎,可用于快速对大数据进行存储,搜索和分析。

​ ElasticSearch和Logstash(数据收集、日志解析引擎)、Kibana(分析和可视化平台)一起开发的。这三个产品被设计成一个集成解决方案,称为“Elastic Stack”(以前被称为ELK技术栈)。

为什么要用ES?

传统关系数据库的缺陷

​ 为了了解ES的优势在哪,我们首先需要回顾传统的mysql数据库作为搜索的时候都有哪些缺陷。

在我们日常搜索的时候,我们都需要通过输入关键词,去检索出来相关的数据。

以搜索“搜索引擎”为例子,你在百度、搜狗等搜索引擎中输入这个关键字,就会得到一系列的搜索结果:

​ 如果这些结果都存储在Mysql数据库中,它大致会呈现如下的存储样式:

​ 每一行会存储唯一标识id、数据内容。

因此,如果需要按照关系型数据库的方式,需要逐行进行搜索匹配相关词,甚至需要用上模糊搜索,如:‘LIKE %xx%’ 等。

​ 且在mysql中,像这类模糊搜索语句,mysql是无法对其建立索引的。因此如果在大数据量下搜索将变得十分缓慢、困难。

​ 而且另外一个点在于,对于搜索引擎来说,还需要将用户输入的词做拆分,依旧是以”搜索引擎“为例子,那么搜索结果其实需要同时包含“搜索”、“引擎”、“搜索引擎”的结果,而这无疑又一次加大了采用关系型数据库实现的复杂性。

​ 总结下来,使用关系型数据库处理搜索问题,主要有两个较大的问题:模糊搜索困难、分词查询支持困难

​ 那么为什么关系型数据库会有这样的问题呢?本质上是关系型数据库的正排索引限制了其搜索性能。你可能这里会好奇了。什么是正排索引呀?

​ 以上面的数据为例子,正排索引就是先找到对应的文章,而后才能够知道每个文章中对应的词是什么。绘制成图片大概就是下面的样子:

​ 因此,如果用这样正排索引的方式搜索,相当于每次都要进行全表的扫描、匹配,那么自然很难支持搜索的能力。

ElasticSearch优势

倒排索引

​ 上面我们总结了传统数据库实现搜索的主要难度在于:模糊搜索困难、分词查询困难

而其归根结底是由于数据库的组织方式是通过正排索引实现的。导致了每次搜索需要匹配的难度大。

​ 那么,这里可能就有聪明的同学想到了,如果根据文章搜索词的难度大,那么是否转变一下存储方式,先存词,再存文章,不就可以一下子搜索到了嘛!

​ 如果你想到了这个,那么恭喜你,你已经具备从零开始研发ES的潜力的。没错,ES为了支持快捷的搜索,底层的实现也是这么做的,而这种实现方法就是大名鼎鼎的----“倒排索引”

数据存储结构

​ 要更深入的了解ES的倒排索引的设计逻辑,我们可以先参照Mysql的数据存储设计介绍几个ES中的常见名词:

Mysql等关系数据库ElasticSearch数据库
数据库(dataBase)索引(index)
表(table)类型(type)
行(row)文档(document)
列(column)字段(field)

​ 结合同Mysql的定义对比,我们就不难理解如下的ES数据代表什么含义了:

{"took": 1,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 1,"relation": "eq"},"max_score": 1.0,"hits": [{"_index": "china","_type": "_doc","_id": "beijing","_score": 1.0,"_source": {"name": "beijing"}}]}
}

​ 像如上的数据,就是实际通过es查询得到的数据。其中的__index就是代表所属的数据索引; __type就是指所属的的文档类型,__id就是对应分词出来的结果内容

​ 那么我们现在已经知道了ES是如何存储数据的,那么还有个问题:ES建立倒排索引的流程是怎样的呢?这个说来也并不困难,主要有以下四步:

第一步,首先就是需要获取文本数据,常见的方法就有网页爬虫、logstash搜集的方式。

第二步,等到数据收集完成以后,我们需要采用分词器进行分词。就是需要将咱们的文本数据拆分成多个细小的单词,用于后续的倒排索引的建立。

第三步,就是生成倒排索引了。

第四步,就是将相关数据同步到集群中的其他节点上。

存在缺陷

​ 那么说了这么多,ES就没有缺点吗?那当然也不是的,从上述的数据处理流程、处理原理来看,Es主要有两个问题:

1、需要分词,写入存储较慢。

2、需要建立的索引量大。

​ 这两种问题也不难理解。对于ES来说,一个文本存储的方式写入的时候需先分词,拆分成多个词才可以插入到索引中。而进行分词的时候就会耗费较多的时间。

​ 同时相比传统的正排索引,原本只需要建立一个索引的文章,现在需要按照词拆分后建立索引。因此创建出的数量就会比原本多得多。

ES的实际应用

​ 上文介绍了ES的原理、优势和劣势。那么什么场景下会用到ES呢?其实最常见的场景就是日志实时分析

​ 这是推动 ES 快速发展的场景,从官方统计数字、云上运营经验看,占据了 ES 使用场景的 70%+。Elastic Stack 提供的完整日志解决方案,已经助力 ES 成为日志实时分析的开源首先方案。

​ 简单来说,日志实时分析主要有三个主要部分组成:logstash、ES集群、kibana。logstash负责收集各个业务系统的日志并推送到ES集群,ES将接收到的日志数据收集起来建立索引。kibana则是提供了一个可视化的搜索能力,用于支持运维人员进行相关报错日志的搜索。

参考文献

ES是什么?

Elasticsearch最新完整版教程通俗易懂,最适合后端编程人员的elasticsearch快速实战教程_ES搜索引擎之核心技术+实战教学

终于有人把Elasticsearch原理讲透了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/41100.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

性能优化的重要性

性能优化的重要性 性能优化的重要性摘要引言注意事项代码示例及注释性能优化的重要性 性能优化的重要性在 Java 中的体现响应速度资源利用效率扩展性与可维护性并发性能合理的锁策略线程安全的数据结构并发工具类的应用避免竞态条件和死锁 总结代码示例 博主 默语带您 Go to Ne…

一张图看懂 USDT三种类型地址 Omni、ERC20、TRC20的区别

USDT是当前实用最广泛,市值最高的稳定币,它是中心化的公司Tether发行的。在今年的4月17日之前,市场上存在着2种不同类型的USDT。4月17日又多了一种波场TRC20协议发行的USDT,它们各自有什么区别呢?哪个转账最快到账?哪…

谷歌推出首款量子弹性 FIDO2 安全密钥

谷歌在本周二宣布推出首个量子弹性 FIDO2 安全密钥,作为其 OpenSK 安全密钥计划的一部分。 Elie Bursztein和Fabian Kaczmarczyck表示:这一开源硬件优化的实现采用了一种新颖的ECC/Dilithium混合签名模式,它结合了ECC抵御标准攻击的安全性和…

[LeetCode]矩阵对角线元素的和

解题 思路 1: 循环,找到主对角线的下标和副对角线的下标,如果矩阵长或宽为奇数的时候,需要减去中间公共的那一个值,中间公共的那个数的下标为mat[mat.size()/2][mat.size()/2]副对角线的下标为 mat [i][mat.size()-i-1] class Solution { public:int diagonalSum(vector<ve…

JVM中判定对象是否回收的的方法

引用计数法 引用计数法是一种垃圾回收&#xff08;Garbage Collection&#xff09;算法&#xff0c;用于自动管理内存中的对象。在引用计数法中&#xff0c;每个对象都有一个关联的引用计数器&#xff0c;用于记录对该对象的引用数量。 当一个新的引用指向对象时&#xff0c;…

Hive底层数据存储格式

前言 在大数据领域,Hive是一种常用的数据仓库工具,用于管理和处理大规模数据集。Hive底层支持多种数据存储格式,这些格式对于数据存储、查询性能和压缩效率等方面有不同的优缺点。本文将介绍Hive底层的三种主要数据存储格式:文本文件格式、Parquet格式和ORC格式。 一、三…

SpringBoot复习:(42)WebServerCustomizer的customize方法是在哪里被调用的?

ServletWebServletAutoConfiguration类定义如下&#xff1a; 可以看到其中通过Import注解导入了其内部类BeanPostProcessorRegister。 BeanPostProcessor中定义的registerBeanDefinition方法会被Spring容器调用。 registerBeanDefinitions方法调用了RegistrySyntheticBeanIf…

解决vue3前端获取文件的绝对路径问题

解决vue3前端获取文件的绝对路径问题 公司的项目是基于vue3的&#xff0c;由于需求需要前端获取用户选的文件的绝对路径。但是浏览器处于安全策略无法获取真实的文件路径&#xff0c;只能拿到相对路径或者是D:\fakepath\xxxx. 看了网上很多方法都很坑&#xff0c;明明没拿到路…

vue基础-vue监听当前屏幕大小做不同的操作

文章目录 前言一、代码如下&#xff1a;总结 前言 在vue项目开发过程中&#xff0c;有个需求&#xff0c;就是当屏幕大于1024时&#xff0c;我们默认为PC模式。小于1024时&#xff0c;我们默认为H5模式。但是有的界面我们想在PC和H5上面展示不同的数据&#xff0c;请求不同的接…

Intellij IDEA SBT依赖分析插件

可分析模块和传递依赖 安装完插件后&#xff0c;由于IDEA BUG&#xff0c;会出现两个分析按钮&#xff0c;一个是gradle的&#xff0c;一般是后者是新安装的sbt。 选择需要分析的模块 只需要在project/plugins.sbt中添加代码&#xff0c;启动官方分析插件addDependencyTreeP…

1281. 整数的各位积和之差

诸神缄默不语-个人CSDN博文目录 力扣刷题笔记 文章目录 1. 简单粗暴的遍历2. 其实也是遍历&#xff0c;但是用Python内置函数只用写一行 1. 简单粗暴的遍历 Python版&#xff1a; class Solution:def subtractProductAndSum(self, n: int) -> int:he0ji1while n>1:last…

redis 数据结构(一)

Redis 为什么那么快 redis是一种内存数据库&#xff0c;所有的操作都是在内存中进行的&#xff0c;还有一种重要原因是&#xff1a;它的数据结构的设计对数据进行增删查改操作很高效。 redis的数据结构是什么 redis数据结构是对redis键值对值的数据类型的底层的实现&#xff0c…

WordToPDF2.java

用Java将Word转PDF 本例子测试了spire.doc.free-3.9.0.jar的包 <dependency><groupId> e-iceblue </groupId><artifactId>spire.doc.free</artifactId><version>3.9.0</version></dependency> package word;import com.spire.…

Java 动态代理

文章目录 静态代理Jdk动态代理cglib动态代理使用案例低配Mybatis低配Feign拦截器 附录代码 大家好&#xff0c;我是入错行的bug猫。&#xff08;http://blog.csdn.net/qq_41399429&#xff0c;谢绝转载&#xff09; 每天进步一点&#xff0c;今日再接再励~ 动态代理在Java中有着…

“深入探索JVM内部机制:解密Java虚拟机“

标题&#xff1a;深入探索JVM内部机制&#xff1a;解密Java虚拟机 摘要&#xff1a;本篇博客将深入剖析Java虚拟机&#xff08;JVM&#xff09;的内部机制&#xff0c;包括类加载、内存管理、垃圾回收、即时编译等关键组成部分。通过对JVM内部机制的解密&#xff0c;我们可以更…

团团代码生成器V1.0:一键生成完整的CRUD功能(提供Gitee源码)

前言&#xff1a;在日常开发的中&#xff0c;经常会需要重复写一些基础的增删改查接口&#xff0c;虽说不难&#xff0c;但是会耗费我们一些时间&#xff0c;所以我自己开发了一套纯SpringBoot实现的代码生成器&#xff0c;可以为我们生成单条数据的增删改查&#xff0c;还可以…

中远麒麟堡垒机 SQL注入漏洞复现

0x01 产品简介 中远麒麟依托自身强大的研发能力,丰富的行业经验&#xff0c;自主研发了新一代软硬件一体化统一安全运维平台一-iAudit 统一安全运维平台。该产品支持对企业运维人员在运维过程中进行统一身份认证、统一授权、统一审计、统一监控&#xff0c;消除了传统运维过程中…

实现Python脚本录制功能

要实现Python脚本录制功能&#xff0c;可以使用Python的内置模块pyautogui和opencv。 首先&#xff0c;需要安装这两个模块&#xff1a; pip install pyautogui opencv-python 然后&#xff0c;可以编写以下代码来实现脚本录制功能&#xff1a; import cv2 import numpy as …

CentOS7.6安装配置MySQL 5.7及常用命令汇总

一、MySQL安装&#xff08;rpm安装&#xff09; 1、检查没有安装过mysql或mariadb rpm -qa | grep -i mysql rpm -qa | grep -i mariadb 返回空值的话&#xff0c;就说明没有安装 MySQL。注意&#xff1a;在新版本的CentOS7中&#xff0c;默认的数据库已更新为了Mariadb&#…

你需要需求管理解决方案的三个原因

我们最近研究了一份 Forrester Research 的报告&#xff0c;得出如下结论&#xff1a;高度监管的行业可以从敏捷需求管理方法中受益。在本文中&#xff0c;我们将深入探讨所有行业的客户如何从一个协作平台中受益&#xff0c;该平台如何帮助他们在复杂的开发周期中管理需求。 …