目录
- 一、Elasticsearch 简介
- 二、Elasticsearch 发展史
- 三、Elasticsearch 功能
- 四、Elasticsearch 特点
- 五、Elasticsearch 应用场景
一、Elasticsearch 简介
Elasticsearch
是一个实时的分布式搜索分析引擎,它能让你以前所未有的速度和规模,去探索你的数据。 它被用作全文检索、结构化搜索、分析以及这三个功能的组合。
Elasticsearch
中没有一个单独的组件是全新的或者是革命性的。全文搜索很久之前就已经可以做到了, 就像很早之前出现的分析系统和分布式数据库。 革命性的成果在于将这些单独的,有用的组件融合到一个单一的、一致的、实时的应用中。对于初学者而言它的门槛相对较低, 而当你的技能提升或需求增加时,它也始终能满足你的需求。
Elasticsearch
是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene™
基础之上。 Lucene
可以说是当下最先进、高性能、全功能的搜索引擎库—无论是开源还是私有。但是 Lucene
仅仅只是一个库。为了充分发挥其功能,你需要使用 Java
并将 Lucene
直接集成到应用程序中。 更糟糕的是,您可能需要获得信息检索学位才能了解其工作原理。Lucene
非常 复杂。Elasticsearch
也是使用 Java
编写的,它的内部使用 Lucene
做索引与搜索,但是它的目的是使全文检索变得简单, 通过隐藏 Lucene
的复杂性,取而代之的提供一套简单一致的 RESTful API
。
- Lucene 是什么?
- Lucene是非常优秀的成熟的 开源的 免费的纯 纯java 语言的全文索引检索工具包。
- Lucene是一个高性能、可伸缩的信息搜索(IR)库。Information Retrieval(IR) library.它使你可以为你的应用程序添加索引和搜索能力。
- Lucene的作者Doug Cutting是资深的全文索引/检索专家,最开始发布在他本人的主页上,2001年10月贡献给APACHE,成为APACHE基金的一个子项目。
- Lucene是一个IR库而不是现成的产品,当然也不是Lucene的初识者常常认为的web爬行器。
二、Elasticsearch 发展史
重要版本发布及版本特性:
0.4:2010年2月第一次发布
- 2010年2月8日, Shay Banon 发表了一篇博客,说他基于Lucene开发(封装 ???)了一个分布式搜索引擎,实现了一些功能。。。
0.7:2010年5月
- 2010年5月14日发布,第一个可以查询到发版信息的版本,重要特性:
- Zen Discovery 自动发现模块
- Groovy Client支持
- 简单的插件管理机制
- 更好支持ICU分词器
- 更多的管理API
1.0:2014年2月
- 2014年2月14日发布,重要特性:
- Snapshot/Restore API 备份恢复API
- 支持聚合分析Aggregations
- CAT API 支持
- 支持联盟查询
- 断路器支持
- Doc values 引入
2.0:2015年10月
- 2015年10月28日发布,重要特性:
- 增加了 pipleline Aggregations
- query/filter 查询合并,都合并到query中,根据不同的上下文执行不同的查询
- 存储压缩可配置
- Rivers 模块被移除
- Multicast 组播发现被移除,成为一个插件,生产环境必须配置单播地址
5.0:2016年10月
- 2016年10月26日发布,重要特性:
- Lucene 6.x 的支持,磁盘空间少一半;索引时间少一半;查询性能提升25%;支持IPV6。
- Internal engine级别移除了用于避免同一文档并发更新的竞争锁,带来15%-20%的性能提升
- Shrink API ,它可将分片数进行收缩成它的因数,如之前你是15个分片,你可以收缩成5个或者3个又或者1个,那么我们就可以想象成这样一种场景,在写入压力非常大的收集阶段,设置足够多的索引,充分利用shard的并行写能力,索引写完之后收缩成更少的shard,提高查询性能
- 提供了第一个Java原生的REST客户端SDK
- IngestNode,之前如果需要对数据进行加工,都是在索引之前进行处理,比如logstash可以对日志进行结构化和转换,现在直接在es就可以处理了
- 提供了 Painless 脚本,代替Groovy脚本
6.0:2017年8月
- 2017年8月31日发布,重要特性:
- 稀疏性 Doc Values 的支持
- Index sorting,即索引阶段的排序。
- 顺序号的支持,每个 es 的操作都有一个顺序编号(类似增量设计)
- 无缝滚动升级
- Removal of types,在 6.0 里面,开始不支持一个 index 里面存在多个 type
- Index-template inheritance,索引版本的继承,目前索引模板是所有匹配的都会合并,这样会造成索引模板有一些冲突问题, 6.0 将会只匹配一个,索引创建时也会进行验证
- Load aware shard routing, 基于负载的请求路由,目前的搜索请求是全节点轮询,那么性能最慢的节点往往会造成整体的延迟增加,新的实现方式将基于队列的耗费时间自动调节队列长度,负载高的节点的队列长度将减少,让其他节点分摊更多的压力,搜索和索引都将基于这种机制。
- 已经关闭的索引将也支持 replica 的自动处理,确保数据可靠。
7.0:2019年4月
- 2019年4月10日发布,重要特性:
- 引入了真正的内存断路器,它可以更精准地检测出无法处理的请求,并防止它们使单个节点不稳定
- Zen2 是 Elasticsearch 的全新集群协调层,提高了可靠性、性能和用户体验,变得更快、更安全,并更易于使用
- 查询优化
- 更快的前 k 个查询
- 间隔查询
- Function score 2.0
8.0:2022年2月
- 2022年2月11日发布,重要特性:
- REST API 兼容性
- 8.0 为 Elasticsearch REST APIs 引入了一些重大的变化。Elasticsearch 已经在 REST API 中增加了对 7.x 兼容性 header 的支持。这些可选的 header 文件让你向 8.0 集群发出 7.x 兼容的请求,并收到 7.x 兼容的响应。
- 安全功能在默认情况下被启用和配置,首次启动 Elasticsearch 时,会自动进行以下安全配置:
- 为传输层和 HTTP 层生成 TLS 证书和密钥。
- TLS 配置设置被写入elasticsearch.yml。
- 为 elastic 用户生成密码。
- 为 Kibana 生成一个注册令牌。
- 系统索引得到更好保护
- 在 Elasticsearch 8.0 中做了一些改变来保护系统索引不被直接访问。要访问系统索引的话,用户现在必须把 allow_restricted_indices 权限设置为 true。
- superuser 角色也不再给予系统索引的写入权限。因此,内置的 elastic superuser 默认不能改变系统索引。
- 此后,开发者应使用 Kibana 或相关的 Elasticsearch APIs 来管理某个功能的数据,而不是访问系统索引。如果你直接访问系统索引,Elasticsearch 将在 API 响应的 header 中和废弃日志中返回警告。
- 新的 kNN 搜索(kNN搜索是通过相似度判断来根据查询向量查找K个邻近的向量),使用kNN的场景有:
- 基于自然语言处理(NLP)算法的相关性排序。
- 产品推荐和推荐引擎。
- 图片或视频的相似搜索。
- 更新了倒排索引的内部数据结构,节省了磁盘存储空间。
- 这种变化将使 keyword 字段类型、 match_only_text 字段类型以及在较小程度上的 text字段类型受益。
- 该更新使得转化为 message 字段索引大小(映射为match_only_text)减少了 14.4%,磁盘占用空间总体减少了 3.5%。
- 加快geo_point,geo_shape和 range 字段索引速度
- 新版本优化了多维点(multi-dimensional points)的索引速度,多维点是用于 geo_point、geo_shape 和range 字段的内部数据结构。Lucene 级别的基准测试显示,这些字段类型的索引速度提高了 10-15%。主要由这些字段组成的 Elasticsearch 索引和数据流可能会在索引速度方面有显著的改进。
- PyTorch 模型支持自然语言处理 (NLP)
- 可以上传在 Elasticsearch 之外训练的 PyTorch 模型,并在摄取时使用它们进行推理。
- 第三方模型支持为 Elastic Stack 带来了现代自然语言处理 (NLP)和搜索用例,例如:
- 填充蒙版 Fill-mask
- 命名实体识别 Named entity recognition (NER)
- 文本分类 Text classification
- 文本嵌入 Text embedding
- 零样本分类 Zero-shot classification
发布日期 | 版本号 | 时间间隔 |
---|---|---|
2010-02-08 | V0.2 | |
2010-05-14 | V0.7 | 95天 |
2014-02-14 | V1.0 | 1372 天 |
2015-10-28 | V2.0 | 621 天 |
2016-10-26 | V5.0 | 364 天 |
2017-11-14 | V6.0 | 384 天 |
2019-04-10 | V7.0 | 512 天 |
2022-02-11 | V8.0 | 1038 天 |
三、Elasticsearch 功能
分布式的搜索引擎和数据分析引擎
- 搜索就是类似于百度,查找各种网页
- 数据分析就类似于博客统计累计访问量、电商平台的销量前十
全文检索、结构化检索、数据分析
- 全文检索类似于sql中的模糊查询,全文进行搜索
- 结构化搜索就类似于指定查询,查找到对应的一行
对海量数据进行近实时处理
- 分布式:ES自定可以将海量数据分散到多台服务器上存储和检索
- 海量数据的处理:分布式以后,就可以采用大量的服务器去存储和检索数据,自然而然就可以实现海量数据的处理了
- 近实时:检索个数据要花费1小时,(这时就不要近实时,做好进行离线批量处理),在秒级别对数据进行搜索和分析
四、Elasticsearch 特点
- 可以作为一个大型分布式集群(数百台服务器)技术,处理PB级数据,服务大公司;也可以运行在单机上,服务小公司
- Elasticsearch不是什么新技术,主要是将全文检索、数据分析以及分布式技术,合并在了一起,才形成了独一无二的ES;lucene(全文检索),商用的数据分析软件(也是有的),分布式数据库(mycat)
- 对用户而言,是开箱即用的,非常简单,作为中小型的应用,直接3分钟部署一下ES,就可以作为生产环境的系统来使用了,数据量不大,操作不是太复杂
- 数据库的功能面对很多领域是不够用的(事务,还有各种联机事务型的操作);特殊的功能,比如全文检索,同义词处理,相关度排名,复杂数据分析,海量数据的近实时处理;Elasticsearch作为传统数据库的一个
- 全文搜索:是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。
五、Elasticsearch 应用场景
站点搜索、系统搜索、数据分析。。。
- 维基百科,类似百度百科,牙膏,牙膏的维基百科,全文检索,高亮,搜索推荐
- The Guardian(国外新闻网站),类似搜狐新闻,用户行为日志(点击,浏览,收藏,评论)+社交网络数据(对某某新闻的相关看法),数据分析,给到每篇新闻文章的作者,让他知道他的文章的公众反馈(好,坏,热门,垃圾,鄙视,崇拜)
- Stack Overflow(国外的程序异常讨论论坛),IT问题,程序的报错,提交上去,有人会跟你讨论和回答,全文检索,搜索相关问题和答案,程序报错了,就会将报错信息粘贴到里面去,搜索有没有对应的答案
- GitHub(开源代码管理),搜索上千亿行代码
- 电商网站,检索商品
- 日志数据分析,logstash采集日志,ES进行复杂的数据分析(ELK技术,elasticsearch+logstash+kibana)
- 商品价格监控网站,用户设定某商品的价格阈值,当低于该阈值的时候,发送通知消息给用户,比如说订阅牙膏的监控,如果高露洁牙膏的家庭套装低于50块钱,就通知我,我就去买
- BI系统,商业智能,Business Intelligence。比如说有个大型商场集团,BI,分析一下某某区域最近3年的用户消费金额的趋势以及用户群体的组成构成,产出相关的数张报表,**区,最近3年,每年消费金额呈现100%的增长,而且用户群体85%是高级白领,开一个新商场。ES执行数据分析和挖掘,Kibana进行数据可视化国内
- 国内:站内搜索(电商,招聘,门户,等等),IT系统搜索(OA,CRM,ERP,等等),数据分析(ES热门的一个使用场景)
参考:
Elasticsearch 中文社区
Elasticsearch 中文文档
Elasticsearch: 权威指南
Elasticsearch-PHP
Elasticsearch 请求示例
Elasticsearch的术语原理概念及应用场景(一)
Elasticsearch基础1——搜索引擎发展史和工作流程、es/es-head/kibana的基础安装