【编程二三事】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原理讲透了!
相关文章:
【编程二三事】ES究竟是个啥?
在最近的项目中,总是或多或少接触到了搜索的能力。而在这些项目之中,或多或少都离不开一个中间件 - ElasticSearch。 今天忙里偷闲,就来好好了解下这个中间件是用来干什么的。 ES是什么? ES全称ElasticSearch,是个基于Lucen…...
爬虫逆向实战(三)--天某云登录
一、数据接口分析 主页地址:天某云 1、抓包 通过抓包可以发现登录接口是account/login 2、判断是否有加密参数 请求参数是否加密? 通过“载荷”模块可以发现password、comParam_signature、comParam_seqCode是加密的 请求头是否加密? 无…...
不要过于迷恋软件架构,要重视如何设计根据简单和清晰的设计
1. 设计一个计算机系统的目标应该是简单性 。 系统越简单,理解起来就越简单,找到问题就越简单,实现它就越简单。描述的语言越清晰,设计就越容易理解。 干净的设计类似于干净的代码:它易于阅读且易于理解。 2. 如何编…...
Grafana监控 Redis Cluster
Grafana监控 Redis Cluster 主要是使用grafana来实现监控,grafana可以对接多种数据源,在官网中可以找到Redis数据源,需要安装redis data source插件。当然也可以利用Prometheus来做数据源,下面分别记录一下这两种数据源的安装配置…...
k8s 认证和权限控制
k8s 的认证机制是啥? 说到 k8s 的认证机制,其实之前咋那么也有提到过 ServiceAccouont ,以及相应的 token ,证书 crt,和基于 HTTP 的认证等等 k8s 会使用如上几种方式来获取客户端身份信息,不限于上面几种…...
性能优化的重要性
性能优化的重要性 性能优化的重要性摘要引言注意事项代码示例及注释性能优化的重要性 性能优化的重要性在 Java 中的体现响应速度资源利用效率扩展性与可维护性并发性能合理的锁策略线程安全的数据结构并发工具类的应用避免竞态条件和死锁 总结代码示例 博主 默语带您 Go to Ne…...
Leetcode No.53 Maximum Subarray
参考资料: 考点:子串 & 动态规划 & [题干] Input: nums [-2,1,-3,4,-1,2,1,-5,4] Output: 6 Explanation: The subarray [4,-1,2,1] has the largest sum 6.1. 心路历程 这道题非常经典,蕴含的思想也是精巧无比。 2. 正解 简单来说官…...
手机出现 不读卡 / 无信号时应该怎么办?
当手机屏幕亮起,一般在屏幕最上方都会有代表手机卡状态的显示,其中网络信号和读卡状态的标识,依旧有很多人分不太清,更不清楚改怎么办了。 1、当我们的手机里有两张卡时,则会有两个信号显示 2、信号状态一般是由短到…...
Linux 内核模块运行机制(10/11)
Linux 内核实现了一个比较酷的功能:支持模块的动态加载和运行。如果你实现了一个内核模块并打算运行它,你并不需要重启系统,直接使用 insmod 命令加载即可,这个模块就像补丁一样打进了 Linux 操作系统,并可以正常运行。…...
MySQL数据库-字符串函数详解
前言 MySQL数据库提供了多种不同类型的函数,用于处理字符串、日期、数值等数据类型,以及实现条件、聚合等操作,下面我们主要介绍字符串函数 CONCAT() 函数 CONCAT() 可用于将多个字符串连接在一起。 示例: SELECT CONCAT(Hell…...
半导体退火那些事(3)
4.半导体退火设备 双腔全自动兼容6-8寸快速退火炉RTP 产地:中国 型号: S803 特点: 室温到1250C,应用于SiC,GaN等第三代半导体领域 简介 (Description) S803系列自动快速退火炉,内置Robot可以自动取放片,适用于最大8英寸 (单片200m…...
1281. 整数的各位积和之差
诸神缄默不语-个人CSDN博文目录 力扣刷题笔记 文章目录 1. 简单粗暴的遍历2. 其实也是遍历,但是用Python内置函数只用写一行 1. 简单粗暴的遍历 Python版: class Solution:def subtractProductAndSum(self, n: int) -> int:he0ji1while n>1:last…...
如何使用Vue和C++实现OJ《从零开始打造 Online Judge》
课程简介 课程链接:https://www.lanqiao.cn/courses/20638 邀请码:x8pGd60V 本课程采用前后端分离架构,基于 Vue.js 和 C 技术,从零开始打造 Online Judge。 课程介绍 OJ 是 Online Judge 系统的简称,用来在线检测…...
在Spring Boot和Vue中实现请求过滤器以验证请求头中的Token
在Spring Boot应用程序中创建一个过滤器类,用于处理请求: Component public class AuthenticationFilter implements Filter {Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException,…...
ThreeJS——在3D地球上标记中国地图板块
Threejs3D地球标记中国地图位置 先看效果 地球预览视频效果 用到的库 TweenJS (动画库)用来做相机转场的动画Jquery(这里只用到一个 each 循环方法,可以使用 js 去写)ThreeJS (3D 地球制作)100000.json(全国城市经纬度)d3.v6.js用来设置平面转3D效果(本来考虑做成…...
第2章 性能测量
理解应用程序性能的第一步是学会对它进行测量。 与绝大多数功能问题相比,性能问题通常很难跟踪和复现。 任何关注过性能评估的人可能都知道公允地进行性能测量并从中得到准确结论是多么困难。 因为在测量中存在误差,性能分析通常需要统计方法进行处理…...
未来,运营的重要性大于产品?
微博上看到某产品大V的一个观点,说在未来,产品运营的重要性会大过产品经理,还挺认同的,谈谈我的想法。 这个观点的核心依据是,目前没有新的产品形态,各种产品解决方案都是标准化的,产品由开疆辟…...
paddle ocr框架识别数字问题和解决方案
识别出的字符串重复 情况1:检测错误,同一个字符串被两次检测到 比如 “12 方案 ” 被识别成:“12” “2方案”,这种可以通过x坐标交叉并且第一个结果最后一个字符与第二个结果第一个字符相同判断 情况2: 识别错误&am…...
构建高性能的MongoDB数据迁移工具:Java的开发实践
随着大数据时代的到来,数据迁移成为许多企业和组织必须面对的挑战之一。作为一种非关系型数据库,MongoDB在应用开发中得到了广泛的应用。为了满足数据迁移的需求,我们需要一个高性能、稳定可靠的MongoDB数据迁移工具。下面将分享使用Java开发…...
2023年国赛数学建模思路 - 案例:最短时间生产计划安排
文章目录 0 赛题思路1 模型描述2 实例2.1 问题描述2.2 数学模型2.2.1 模型流程2.2.2 符号约定2.2.3 求解模型 2.3 相关代码2.4 模型求解结果 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 最短时…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
