草庐IT

Elasticsearch 简介

恋喵大鲤鱼 2023-06-11 原文


文章目录

1.简介

Elasticsearch(ES) 是一个基于 Apache Lucene 开源的分布式、高扩展、近实时的搜索引擎,主要用于海量数据快速存储,实时检索,高效分析的场景。通过简单易用的 RESTful API,隐藏 Lucene 的复杂性,让全文搜索变得简单。

ES 功能总结有三点:

  • 分布式存储
  • 分布式搜索
  • 分布式分析

因为是分布式,可将海量数据分散到多台服务器上存储,检索和分析,只要是海量数据需要完成上面这三种操作的业务场景,一般都会考虑使用 ES,比如维基百科,Stack Overflow,GitHub 后台均有使用。

下面是 DB-Engines Ranking 给出的数据库流行度排行榜(截止至 202203)。ES 位居 Top 10 的位置,受欢迎的程度,可见一斑。

2.特点

ES 为什么这么受欢迎,得益于其相较于传统数据库所拥有的强大功能。

  • ES 不是什么新技术,主要是将全文检索、数据分析以及分布式技术结合在一起,形成了独一无二的 ES;
  • 数据库的功能面对很多领域是不够用的,比如全文检索,同义词处理,相关度排名,复杂数据分析,海量数据的近实时处理;ES 作为传统数据库的一个补充,提供了数据库所不不能提供的很多功能;
  • 可以作为一个大型分布式集群(数百台服务器),处理 PB 级数据,服务大公司;也可以运行在单机上,服务小公司;
  • 对用户而言,开箱即用,非常简单,作为中小型的应用,分钟级部署,就可以作为生产环境的系统来使用了。

ES 底层基于 Lucene 开发,针对 Lucene 的局限性,ES 提供了 RESTful API 风格的接口、支持分布式、可水平扩展,同时它可以被多种编程语言调用。

ES 除了进行全文检索,也支持聚合/排序。随着 ES 功能越来越强大,其和传统数据库的边界越来越模糊。我们既可以把 ES 当作搜索引擎来使用,也可以将其作为传统关系型数据库来使用。

3.发展历史

3.1 Lucene

没有 Lucene 就没有 Elasticsearch。

上图为 Doug Cutting,他是 Lucene 之父,也是 Hadoop 之父。Doug Cutting 毕业于斯坦福大学,在 Xerox 积累了一定的工作经验后,从 1997 年开始,利用业余时间开发出了 Lucene。Lucene 面世于1999年,并于 2005 年成为 Apache 顶级开源项目。

Lucene 优点:

  • 基于 Java 开发的开源搜索引擎类库。
  • 高性能:在相同的硬件环境下,基于 Hadoop 的 webmap(Lucene 的第一个应用)的反应速度是之前系统的 33 倍。

Lucene 的不足:

  • 只能基于Java语言开发。
  • 类库的接口学习和使用成本高。
  • 原生并不支持水平扩展(这对于搜索引擎来说是一个非常大的问题)。

3.2 ES 发展历史

因为 Lucene 的强大但不易用,Shay Banon 在 Lucene 的基础上做了二次开发,于是 ES 诞生了。

Shay Banon 是 ElasticSearch 之父,也是 Elastic 公司的创始人。

2004 年,Shay Banon 基于Lucene 开发了 ElasticSearch 的前身 Compass。在考虑 Compass 的第三个版本时,他意识到有必要重写 Compass 的大部分内容,以“创建一个可扩展的搜索解决方案”。因此,他创建了“一个从头构建的分布式解决方案”,并使用了一个公共接口,即 HTTP 上的 JSON,它也适用于 Java 以外的编程语言。

2010 年,Shay Banon 发布了 Elasticsearch 的第一个版本。

ES多个版本可能出现破坏性变更,例如,在 6.x,ES 不允许一个 Index 中出现多个 Type。在 ES 官网,每个版本都对应着一个使用文档。

在使用 ES 之前,我们先了解下 ES 的发展简史。下面列出一些比较重大的更新版本,可以在了解了基本概念之后再看一遍。

初始版本:0.7.0 2010年5月14日

  • Zen Discovery 自动发现模块
  • Groovy Client支持
  • 简单的插件管理机制
  • 更好支持ICU分词器

1.0.0:2014年2月14日

  • 支持聚合分析Aggregations
  • CAT API 支持
  • Doc values 引入
  • 支持联盟查询
  • 断路器支持

2.0.0:2015年10月28日

  • query/filter 查询合并,都合并到query中,根据不同的context执行不同的查询
  • 增加了 pipleline Aggregations
  • 在 ES 中,有 Query 和 Filter 两种 Context
  • Query Context :相关性算分
  • Filter Context :不需要算分(YES OR NO), 可以利用 Cache 获得更好的性能
  • 存储压缩可配置
  • Rivers 模块被移除
  • Multicast 组播发现成为组件

5.0.0:2016年10月26日

  • Lucene 6.x 的支持,磁盘空间少一半;索引时间少一半;查询性能提升25%;支持IPV6。
  • Internal engine级别移除了用于避免同一文档并发更新的竞争锁,带来15%-20%的性能提升
  • Shrink API ,它可将分片数进行收缩成它的因数,如之前你是15个分片,你可以收缩成5个或者3个又或者1个,那么我们就可以想象成这样一种场景,在写入压力非常大的收集阶段,设置足够多的索引,充分利用shard的并行写能力,索引写完之后收缩成更少的shard,提高查询性能。
  • 引入新的字段类型 Text/Keyword 来替换 String
  • 提供了 Painless 脚本,代替Groovy脚本
  • 新增 Sliced Scroll类型,现在Scroll接口可以并发来进行数据遍历了。每个Scroll请求,可以分成多个Slice请求,可以理解为切片,各Slice独立并行,利用Scroll重建或者遍历要快很多倍。
  • 限制索引请求大小,避免大量并发请求压垮 ES
  • 限制单个请求的 shards 数量,默认 1000 个

6.0.0:2017年8月31日

  • Index sorting,即索引阶段的排序。
  • 顺序号的支持,每个 es 的操作都有一个顺序编号(类似增量设计)
  • 无缝滚动升级
  • 逐步废弃type,在 6.0 里面,开始不支持一个 index 里面存在多个 type
  • Index-template inheritance,索引版本的继承,目前索引模板是所有匹配的都会合并,这样会造成索引模板有一些冲突问题, 6.0 将会只匹配一个,索引创建时也会进行验证
  • Load aware shard routing, 基于负载的请求路由,目前的搜索请求是全节点轮询,那么性能最慢的节点往往会造成整体的延迟增加,新的实现方式将基于队列的耗费时间自动调节队列长度,负载高的节点的队列长度将减少,让其他节点分摊更多的压力,搜索和索引都将基于这种机制。
  • 已经关闭的索引将也支持 replica 的自动处理,确保数据可靠。

7.0.0:2019年4月10日

  • 集群连接变化:TransportClient被废弃 以至于,es7的java代码,只能使用restclient
  • 重大改进-正式废除单个索引下多Type的支持
  • ES6 时,官方就提到了ES7会删除 type,并且 ES6 时已经规定每一个index只能有一个 type。在 ES7 中使用默认的_doc 作为 type,官方说在 8.x 版本会彻底移除 type。 API 请求方式也发生变化,如获得某索引的某ID的文档:GET index/_doc/id其中index和id为具体的值
  • Lucene9.0
  • 引入了真正的内存断路器,它可以更精准地检测出无法处理的请求,并防止它们使单个节点不稳定
  • Zen2 是 Elasticsearch 的全新集群协调层,提高了可靠性、性能和用户体验,变得更快、更安全,并更易于使用
    新功能
  • New Cluster coordination
  • Feature - Complete High Level REST Client
  • Script Score Query
  • 性能优化
  • Weak-AND算法提高查询性能
  • 默认的Primary Shared数从5改为1,避免 Over Sharding。shard也是一种资源,shard过多会影响集群的稳定性。因为shard过多,元信息会变多,这些元信息会占用堆内存。shard过多也会影响读写性能,因为每个读写请求都需要一个线程。所以如果index没有很大的数据量,不需要设置很多shard。
  • 更快的前 k 个查询
  • 间隔查询(Intervals queries) 某些搜索用例(如法律和专利搜索)引入了查找单词或短语彼此相距一定距离的记录的需要。 E S7 中的间隔查询引入了一种构建此类查询的全新方式,与之前的方法(跨度查询 span queries)相比,使用和定义更加简单。 与跨度查询相比,间隔查询对边缘情况的适应性更强。

4.Kibana

说到 ES 必须要提一下 Kibana 。

ES、Logstash 和 Kibana 共同组成 ELK。ELK 是这三个开源项目的首字母缩写。这个三个项目组合在一起,就形成了 ELK 软件栈。他们三个共同形成了一个强大的生态圈。

简单地说,Logstash 是服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到诸如 ES 等存储库中。Kibana 则可以让用户在 Elasticsearch 中使用图形和图表对数据进行可视化。Elasticsearch 处于最核心的位置,它可以帮我们对数据进行快速地搜索及分析。

Kibana 以 Web 的形式提供了一个可视化操作 ES 的工具,负责数据展示,分析,管理,监督及应用。如支持根据 ES 数据绘制图表,ES 查询语法自动补全等高级特性,方便我们操作 ES。

事实上 Elasticsearch 的完整栈有如下的几个:

其中 Beats 是一个免费且开放的平台,集合了多种单一用途数据采集器。它们从成千上万台机器和系统中向 Logstash 或 Elasticsearch 发送数据。

5.小结

Elasticsearch 是一个基于 Lucene 的开源搜素和分析引擎,有很好的性能,天生支持水平个扩展。

ES 功能丰富,易于使用,即可做搜索引擎,也可做传统数据库来使用,支持多种客户端语言接入。此外,ES 拥有活跃的社区,背后还有一个强大的公司公司 Elastic 做支撑,功能在不断丰富迭代。


参考文献

Elasticsearch 官网
Elasticsearch 简介
百度百科.elasticsearch
DB-Engines Ranking
ES学习(02):ElasticSearch简介及其发展历史
ElasticSearch之各大版本演进

有关Elasticsearch 简介的更多相关文章

  1. HBase Region 简介和建议数量&大小 - 2

    Region是HBase数据管理的基本单位,region有一点像关系型数据的分区。region中存储这用户的真实数据,而为了管理这些数据,HBase使用了RegionSever来管理region。Region的结构hbaseregion的大小设置默认情况下,每个Table起初只有一个Region,随着数据的不断写入,Region会自动进行拆分。刚拆分时,两个子Region都位于当前的RegionServer,但处于负载均衡的考虑,HMaster有可能会将某个Region转移给其他的RegionServer。RegionSplit时机:当1个region中的某个Store下所有StoreFile

  2. ruby - Rails Elasticsearch 聚合 - 2

    不知何故,我似乎无法获得包含我的聚合的响应...使用curl它按预期工作:HBZUMB01$curl-XPOST"http://localhost:9200/contents/_search"-d'{"size":0,"aggs":{"sport_count":{"value_count":{"field":"dwid"}}}}'我收到回复:{"took":4,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":90,"max_score":0.0,"hits":[]},"a

  3. elasticsearch源码关于TransportSearchAction【阶段三】 - 2

    1.回顾.TransportServicepublicclassTransportServiceextendsAbstractLifecycleComponentTransportService:方法:1publicfinalTextendsTransportResponse>voidsendRequest(finalTransport.Connectionconnection,finalStringaction,finalTransportRequestrequest,finalTransportRequestOptionsoptions,TransportResponseHandlerT>

  4. ruby-on-rails - 使用 Rails (Tire) 和 ElasticSearch 进行模糊字符串匹配 - 2

    我有一个Rails应用程序,现在设置了ElasticSearch和Tiregem以在模型上进行搜索,我想知道我应该如何设置我的应用程序以对模型中的某些索引进行模糊字符串匹配。我将我的模型设置为索引标题、描述等内容,但我想对其中一些进行模糊字符串匹配,但我不确定在何处进行此操作。如果您想发表评论,我将在下面包含我的代码!谢谢!在Controller中:defsearch@resource=Resource.search(params[:q],:page=>(params[:page]||1),:per_page=>15,load:true)end在模型中:classResource'Us

  5. IDEA 2023.1 正式发布,新特性简介 - 2

     昨晚看到IDEA官推宣布IntelliJIDEA2023.1正式发布了。简单看了一下,发现这次的新版本包含了许多改进,进一步优化了用户体验,提高了便捷性。至于是否升级最新版本完全是个人意愿,如果觉得新版本没有让自己感兴趣的改进,完全就不用升级,影响不大。软件的版本迭代非常正常,正确看待即可,不持续改进就会慢慢被淘汰!根据官方介绍:IntelliJIDEA2023.1针对新的用户界面进行了大量重构,这些改进都是基于收到的宝贵反馈而实现的。官方还实施了性能增强措施,使得Maven导入更快,并且在打开项目时IDE功能更早地可用。由于后台提交检查,新版本提供了简化的提交流程。IntelliJIDEA

  6. 美团外卖搜索基于Elasticsearch的优化实践 - 2

    美团外卖搜索工程团队在Elasticsearch的优化实践中,基于Location-BasedService(LBS)业务场景对Elasticsearch的查询性能进行优化。该优化基于Run-LengthEncoding(RLE)设计了一款高效的倒排索引结构,使检索耗时(TP99)降低了84%。本文从问题分析、技术选型、优化方案等方面进行阐述,并给出最终灰度验证的结论。1.前言最近十年,Elasticsearch已经成为了最受欢迎的开源检索引擎,其作为离线数仓、近线检索、B端检索的经典基建,已沉淀了大量的实践案例及优化总结。然而在高并发、高可用、大数据量的C端场景,目前可参考的资料并不多。因此

  7. 【详解】Docker安装Elasticsearch7.16.1集群 - 2

    开门见山|拉取镜像dockerpullelasticsearch:7.16.1|配置存放的目录#存放配置文件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/config#存放数据的文件夹mkdir-p/opt/docker/elasticsearch/node-1/data#存放运行日志的文件夹mkdir-p/opt/docker/elasticsearch/node-1/log#存放IK分词插件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/plugins若你使用了moba,直接右键新建即可如上图所示依次类推创建

  8. 【Elasticsearch基础】Elasticsearch索引、文档以及映射操作详解 - 2

    文章目录概念索引相关操作创建索引更新副本查看索引删除索引索引的打开与关闭收缩索引索引别名查询索引别名文档相关操作新建文档查询文档更新文档删除文档映射相关操作查询文档映射创建静态映射创建索引并添加映射概念es中有三个概念要清楚,分别为索引、映射和文档(不用死记硬背,大概有个印象就可以)索引可理解为MySQL数据库;映射可理解为MySQL的表结构;文档可理解为MySQL表中的每行数据静态映射和动态映射上面已经介绍了,映射可理解为MySQL的表结构,在MySQL中,向表中插入数据是需要先创建表结构的;但在es中不必这样,可以直接插入文档,es可以根据插入的文档(数据),动态的创建映射(表结构),这就

  9. ruby-on-rails - Elasticsearch 问题 : Cannot connect AWS elasticsearch service - 2

    我有一个关于配置elasticsearch以连接AWSelasticsearch服务以在生产环境中运行项目的问题。我的gem文件:gem'searchkick'gem'faraday_middleware-aws-signers-v4'gem'aws-sdk','~>2'gem"elasticsearch",">=1.0.15"引用:https://github.com/ankane/searchkick我的config/initializers/elasticsearch.rb文件:require"faraday_middleware/aws_signers_v4"ENV["ELAS

  10. linux查看es节点使用情况,elasticsearch(es) 如何查看当前集群中哪个节点是主节点(master) - 2

    elasticsearch查看当前集群中的master节点是哪个需要使用_cat监控命令,具体如下。查看方法es主节点确定命令,以kibana上查看示例如下:GET_cat/nodesv返回结果示例如下:ipheap.percentram.percentcpuload_1mload_5mload_15mnode.rolemastername172.16.16.188529952.591.701.45mdi-elastic3172.16.16.187329950.990.991.19mdi-elastic2172.16.16.231699940.871.001.03mdi-elastic4172

随机推荐