Elasticsearch 基础教程

Elasticsearch 高级教程

Elasticsearch 插件

Elasticsearch 笔记

Elasticsearch FAQ

original icon
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.knowledgedict.com/tutorial/elasticsearch-intro.html

Elasticsearch 简介


Elasticsearch是一个基于Lucene的搜索和数据分析工具,它提供了一个分布式服务。Elasticsearch是遵从Apache开源条款的一款开源产品,是当前主流的企业级搜索引擎。

它用于全文搜索、结构化搜索、分析以及将这三者混合使用:

  • 维基百科使用Elasticsearch提供全文搜索并高亮关键字,以及输入实时搜索(search-as-you-type)搜索纠错(did-you-mean)等搜索建议功能。

  • 英国卫报使用Elasticsearch结合用户日志和社交网络数据提供给他们的编辑以实时的反馈,以便及时了解公众对新发表的文章的回应。

  • StackOverflow结合全文搜索与地理位置查询,以及more-like-this功能来找到相关的问题和答案。

  • Github使用Elasticsearch检索1300亿行的代码。

Elasticsearch 特点

  • 分布式的实时文件存储,每个字段都被索引并可被搜索;
  • 分布式的实时分析搜索引擎;
  • 可弹性扩展到上百台服务器规模,处理PB级结构化或非结构化数据;
  • 开箱即用(安装即可使用),它提供了许多合理的缺省值,并对初学者隐藏了复杂的搜索引擎理论。只需很少的学习既可在生产环境中使用。

Elasticsearch 发展历史

背景

Elasticsearch 源于一个食谱的应用,它的作者是 Shay Banon。

在谈及当年接触 Lucene 并开发 Elasticsearch 的初衷的时候,Shay Banon 认为自己参与 Lucene 完全是一种偶然,当年他还是一个待业工程师,跟随自己的新婚妻子来到伦敦,妻子想在伦敦学习做一名厨师,而自己则想为妻子开发一个方便搜索菜谱的应用,所以才接触到 Lucene。直接使用 Lucene 构建搜索有很多问题,包含大量重复性的工作,所以 Shay Banon 便在 Lucene 的基础上不断地进行抽象,让 Java 程序嵌入搜索变得更容易,经过一段时间的打磨便诞生了他的第一个开源作品 Compass,中文即“指南针”的意思。之后,他找到了一份面对高性能分布式开发环境的新工作,在工作中他渐渐发现越来越需要一个易用的、高性能、实时、分布式搜索服务,于是决定重写 Compass,将它从一个库打造成了一个独立的 server,并创建了开源项目 Elasticsearch。

版本历史

  • 2010 年 2 月 8 日,Elasticsearch 第一个公开版本发布。
  • 2010 年 5 月 14 日,发布第一个具有里程碑意义的初始版本 0.7.0,具有如下特征:
    • Zen Discovery 自动发现模块;
    • 支持 Groovy Client;
    • 简单的插件管理机制;
    • 更好地支持 icu 分词器;
    • 更多的管理 api。
  • 2013 年初,GitHub 抛弃了 Solr,采取 ElasticSearch 来做其 PB 级的搜索。
  • 2014 年 2 月 14 日,发布 1.0.0 版本,增加如下重要特性:
    • 支持 Snapshot/Restore API 备份恢复 API;
    • 支持聚合分析 Aggregations;
    • 支持 cat api;
    • 支持断路器;
    • 引入 Doc values。
  • 2015 年 10 月 28 日,发布 2.0.0 版本,有如下重要特性:
    • 增加了 Pipleline Aggregations;
    • query/filter 查询合并,都合并到 query 中,根据不同的上下文执行不同的查询;
    • 压缩存储可配置;
    • Rivers 模块被移除;
    • Multicast 组播发现被移除,成为一个插件,生产环境必须配置单播地址。
  • 2016 年 10 月 26 日,发布 5.0.0 版本,有如下重大特性变化:
    • 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 脚本;
    • 移除 site plugins,就是说 head、bigdesk 都不能直接装 es 里面了,不过可以部署独立站点(反正都是静态文件)或开发 kibana 插件;
    • 新增 Sliced Scroll 类型,现在 Scroll 接口可以并发来进行数据遍历了。每个 Scroll 请求,可以分成多个 Slice 请求,可以理解为切片,各 Slice 独立并行,利用 Scroll 重建或者遍历要快很多倍;
    • 新增了 Profile API;
    • 新增了 Rollover API;
    • 新增 Reindex;
    • 引入新的字段类型 Text/Keyword 来替换 String;
    • 限制索引请求大小,避免大量并发请求压垮 ES;
    • 限制单个请求的 shards 数量,默认 1000 个。
  • 2017 年 8 月 31 日,发布 6.0.0 版本,具有如下重要特性:
    • 稀疏性 Doc Values 的支持;
    • Index Sorting,即索引阶段的排序;
    • 顺序号的支持,每个 es 的操作都有一个顺序编号(类似增量设计);
    • 无缝滚动升级;
    • 从 6.0 开始不支持一个 index 里面存在多个 type;
    • Index-template inheritance,索引版本的继承,目前索引模板是所有匹配的都会合并,这样会造成索引模板有一些冲突问题, 6.0 将会只匹配一个,索引创建时也会进行验证;
    • Load aware shard routing, 基于负载的请求路由,目前的搜索请求是全节点轮询,那么性能最慢的节点往往会造成整体的延迟增加,新的实现方式将基于队列的耗费时间自动调节队列长度,负载高的节点的队列长度将减少,让其他节点分摊更多的压力,搜索和索引都将基于这种机制;
    • 已经关闭的索引将也支持 replica 的自动处理,确保数据可靠。
  • 2019 年 4 月 10 日,发布 7.0.0 版本,具有如下重要特性:
    • 集群连接变化:TransportClient 被废弃,es7 的 java 代码,只能使用 restclient;对于 java 编程,建议采用 High-level-rest-client 的方式操作 ES 集群;
    • ES 程序包默认打包 jdk:7.x 版本的程序包大小变成 300MB+,对比 6.x,包大了 200MB+,这正是 JDK 的大小;
    • 采用基于 Lucene 9.0;
    • 正式废除单个索引下多 Type 的支持,es6 时,官方就提到了 es7 会删除 type,并且 es6 时,已经规定每一个 index 只能有一个 type。在 es7 中,使用默认的 _doc 作为 type,官方说在 8.x 版本会彻底移除 type。api 请求方式也发送变化,如获得某索引的某 ID 的文档:GET index/_doc/id 其中 index 和 id 为具体的值;
    • 引入了真正的内存断路器,它可以更精准地检测出无法处理的请求,并防止它们使单个节点不稳定;
    • Zen2 是 Elasticsearch 的全新集群协调层,提高了可靠性、性能和用户体验,变得更快、更安全,并更易于使用。

Elasticsearch 概念

下列有一些概念是Elasticsearch的核心。从一开始就理解这些概念将极大地帮助简化学习Elasticsearch的过程。

近实时(NRT)

Elasticsearch是一个近乎实时的搜索平台。这意味着从索引文档到可搜索文档的时间有一点延迟(通常是一秒)。

集群(Cluster)

集群是一个或多个节点的集合,它们共同保存您的整个数据,并提供跨所有节点的联合索引和搜索功能。群集由唯一的名称标识,默认情况下为“elasticsearch”。此名称很重要,因为如果节点设置为按名称加入群集,则该节点只能是群集的一部分。

确保不要在不同的环境中重用相同的群集名称,否则很可能会导致节点加入错误的群集。例如,您可以使用logging-dev,logging-stage以及logging-prod用于开发,预发和生产环境。

值得注意的是,如果群集中只有一个节点,那么它是完全正常的。此外,您还可以拥有多个独立的集群,每个集群都有自己唯一的集群名称。

节点(Node)

节点是作为集群一部分的单个服务器,存储数据并参与集群的索引和搜索功能。就像集群一样,节点由名称标识,默认情况下,该名称是在启动时分配给节点的随机通用唯一标识符(UUID)。如果不需要默认值,可以定义所需的任何节点名称。此名称对于管理目的非常重要,您可以在其中识别网络中哪些服务器与Elasticsearch集群中的哪些节点相对应。

可以将节点配置为按集群名称加入特定群集。默认情况下,每个节点都设置为加入一个名为cluster的集群elasticsearch,这意味着如果您在网络上启动了许多节点并且假设它们可以相互发现,它们将自动形成并加入一个名为elasticsearch的集群。

在单个集群中,可以拥有任意数量的节点。此外,如果网络上当前没有其他Elasticsearch节点正在运行,则默认情况下启动单个节点将形成一个名为elasticsearch的新单节点集群。

索引(Index)

索引是具有某些类似特征的文档集合。

例如,可以给客户数据建立一个索引,给产品目录建立另一个索引或给订单数据的建立一个索引。

索引有一个名称标识(必须全部小写),此名称用于在对其中的文档执行索引,搜索,更新和删除操作时引用索引所用。

在单个群集中,您可以根据需要定义任意数量的索引。

类型(Type)

type是一个逻辑意义上的分类或者叫分区,允许在同一索引中建立多个type。本质是相当于一个过滤条件,高版本将会废弃type概念。

6.0.0版本及之后,废弃type

文档(Document)

文档是可以编制索引的基本信息单元。例如,您可以为单个客户提供文档,为单个产品提供另一个文档,为单个订单提供另一个文档。该文档以JSON(JavaScript Object Notation)表示,JSON是一种普遍存在的互联网数据交换格式。

在索引/类型中,可以根据需要存储任意数量的文档。

值得注意的是,尽管文档实际上驻留在索引中,但实际上必须将文档分配给索引中的一个类型(type)中。 

分片(Shards)

索引可能存储大量可能超过单个节点硬件限制的数据。例如,占用1TB磁盘空间的十亿个文档的单个索引可能不适合单个节点的磁盘,或者可能太慢而无法单独从单个节点提供搜索请求。

为了解决这个问题,Elasticsearch提供了将索引细分为多个称为分片的功能。创建索引时,只需定义所需的分片数即可。每个分片本身都是一个功能齐全且独立的“索引”,可以托管在集群中的任何节点上。

分片很重要,主要有两个原因:

  • 它允许集群进行水平扩展;
  • 它允许集群跨分片(可能在多个节点上)分布和并行化操作,从而提高性能和吞吐量。

分片的分布方式以及如何将其文档聚合回搜索请求的机制完全由Elasticsearch管理,对用户而言是透明的。

副本(Replicas)

副本主要是针对主分片(Shards)的复制,Elasticsearch中主分片可以拥有0个或多个的副本。

副本分片的主要目的就是为了故障转移。

分片副本很重要,主要有两个原因:

  • 它在分片或节点发生故障时提供高可用性。因此,副本分片永远不会在与其复制的主分片相同的节点;
  • 副本分片也可以接受搜索的请求,可以并行搜索,从而提高系统的吞吐量。

每个Elasticsearch分片都是Lucene索引。单个Lucene索引中可以包含最大数量的文档。截止LUCENE-5843,限制是2,147,483,519(= Integer.MAX_VALUE - 128)文档。您可以使用_cat/shardsAPI 监控分片大小。

Java 是一种广泛使用的计算机编程语言,拥有跨平台、面向对象、泛型编程的特性,广泛应用于企业级 Web 应用开发和移动应用开发。 ...
采用了MVT的软件设计模式,即模型(Model),视图(View)和模板(Template)。这套框架是以比利时的吉普赛爵士吉他手Djang ...
Redis 是业界主流的高性能的 key-value NoSQL 数据库,是一个使用 ANSI C 编写的开源、支持网络、基于内存、可选持久 ...
Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。由荷兰人Guido van Rossum于1989年底发明,第一个公开发 ...
Flask 是一个用 Python 编写的轻量级 Web 应用程序框架。Flask 是由一个名字叫作 Armin Ronacher(他也是 ...