Day16_01_ES教程之ElasticSearch简介

ElasticSearch简介

一. ElasticSearch初识

1. ElasticSearch概念

全文搜索属于很常见的需求,开源的 Elasticsearch(以下简称 Elastic)是目前全文搜索引擎的首选.它可以快速地储存、搜索和分析海量数据,维基百科、Stack Overflow、Github 都采用它.

  • GitHub 使用 Elasticsearch 检索超过 800 万的代码库;

  • eBay 使用 Elasticsearch 搜索海量的商品数据;

  • Netflix 使用 Elasticsearch 来实现高效的消息传递系统.

Elasticsearch是一个分布式的文档(document)存储引擎,它可以实时存储并检索复杂数据结构——序列化的JSON文档,并提供了友好的 RESTful API 来对数据进行操作.它能快速的批量查询出数据,在Elasticsearch中,每一个字段的数据都是默认被索引的,所以ES的查询速度很快.

2. ElasticSearch与Lucene

elasticsearch是基于lucene框架的实现,所以我们先概述下两者.

1️⃣. lucene: 可以说是搜索引擎的鼻祖,是最先进、功能最强大的搜索库,但是直接基于lucene开发的话会非常复杂,因为他的api极其复杂(实现一些简单的功能,需要写大量的java代码,好比以前的jdbc),还需要深入理解其内部各种索引结构.

2️⃣. elasticsearch: 基于lucene,是lucene的最完美的框架之一(比较知名的还有solr),隐藏了复杂性,提供简单易用的restful api接口、java api接口等(相当于jdbc的框架,无需了解太多底层,开箱即用).

Elastic 的底层是开源库 Lucene,但是你没法直接用 Lucene,因为Lucene必须自己写代码去调用它的接口.Elastic 是 Lucene 的封装,提供了 REST API 的操作接口,开箱即用.
它是一个建立在全文搜索引擎 Apache Lucene(TM)基础上的搜索引擎,可以说 Lucene 是当今最先进,最高效的全功能开源搜索引擎框架.

但是 Lucene 只是一个框架,要充分利用它的功能,你需要使用 JAVA,并且在你的程序中集成 Lucene.更糟的是,你需要做很多的学习了解,才能明白它是如何运行的,Lucene 确实非常复杂.

Elasticsearch 使用 Lucene 作为内部引擎,但是在你使用它做全文搜索时,只需要使用统一开发好的API即可,而并不需要了解其背后复杂的 Lucene 的运行原理.

2. Elasticsearch功能

当然 Elasticsearch 并不仅仅是只有 Lucene 那么简单的功能,它不仅包括了全文搜索功能,还可以进行以下工作:

  • 分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索;

  • 实时分析的分布式搜索引擎;

  • 可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据;

  • 这么多的功能被集成到一台服务器上,你可以轻松地通过客户端或者任何你喜欢的程序语言与 ES 的 RESTful API 进行交流.

Elasticsearch 的上手是非常简单的,它附带了很多非常合理的默认值,这让初学者很好地避免一上手就要面对复杂的理论,它安装好了就可以使用了,用很小的学习成本就可以变得很有生产力.

3. ElasticSearch使用场景

  • 1️⃣. 它提供了强大的搜索功能;

  • 2️⃣. 使用ES、Kibaba、Logstash完成日志采集分析;

  • 3️⃣. 可以提供预警功能(持续的查询分析某个数据,如果超过一定的值,就进行警告);

  • 4️⃣. 可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据.

4. Elasticsearch的优点

  • 1️⃣. 分布式的文档(document)存储引擎;

  • 2️⃣. 分布式的搜索引擎的分析引擎;

  • 3️⃣. 分布式,支持PB级数据(大量数据的支持);

  • 4️⃣. 开箱即用,优秀的默认参数,不需要任何额外设置(懂其原理的可以调整优化),完全开源.

二. ElasticSearch核心概念

Elasticsearch有几个核心概念,从一开始理解这些概念会对整个学习过程有莫大的帮助.

1. 接近实时(Near Realtime,NRT)

ElasticSearch并不是一个标准的数据库,它不像MongoDB. ES侧重于对存储的数据进行搜索,因此要注意到它不是实时读写的.这也就意味着刚刚存储的数据,并不能马上查询到.

Elasticsearch是一个接近实时的搜索平台,这意味着从数据写入到数据可以被搜索有一个轻微的延迟(通常是1秒).这个延迟是肯定会发生的延迟,而不是随机延迟,ES写入到被搜索到会有1s之内的延迟.

2. 集群(cluster)

一个集群就是由一个或多个节点组织在一起,它们共同持有你整个的数据,并一起提供索引和搜索功能.一个集群由一个唯一的名字标识,这个名字默认就是“elasticsearch”.这个名字是重要的,因为一个节点只能通过指定某个集群的名字,来加入这个集群.在产品环境中显式地设定这个名字是一个好习惯,但是使用默认值来进行测试/开发也是不错的.

3. 节点(node)

一个节点就是集群中的一个服务器,作为集群的一部分,它存储我们的数据,参与集群的索引和搜索功能.和集群类似,一个节点也是由一个名字来标识的,默认情况下这个名字是一个随机的漫威漫画角色的名字,ES启动时会设置这个节点的名字.默认会自动生成一个名字,这个名字在后续的集群管理中还是很有作用的,因此如果想要手动的管理或者查看一些集群的信息,最好是自定义一下节点的名字.

一个节点可以通过配置集群名称的方式来加入一个指定的集群.默认情况下,每个节点都会被安排加入到一个叫做“elasticsearch”的集群中,这意味着如果你在你的网络中启动了若干个节点,并假定它们能够相互发现彼此,它们将会自动地形成并加入到一个叫做“elasticsearch”的集群中.

在一个集群里,只要你想,可以拥有任意多个节点.而且如果当前你的网络中没有运行任何Elasticsearch节点,这时启动一个节点,会默认创建并加入一个叫做“elasticsearch”的集群.

4. 索引(index)

在Elasticsearch中存储数据的行为就叫做索引(indexing).

一个索引就是一个拥有几分相似特征的文档的集合.比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引.一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对对应于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字.索引类似于关系型数据库中Database的概念.在一个集群中,如果你想,可以定义任意多的索引.

ES和传统关系型数据库的对比:

5. 类型(type)

在一个索引中,你可以定义一种或多种类型.一个类型就是你的索引的一个逻辑上的分类/分区,用于标识不同的文档字段信息的集合,其语义完全由你来定.通常,会为具有一组共同字段的文档定义一个类型.比如说,我们假设你运营一个博客平台并且将你所有的数据存储到一个索引中.在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型.当然也可以为评论数据定义另一个类型,类型类似于关系型数据库中Table的概念.

由于ES是以索引为粗粒度的单位,因此一个索引下的所有的类型,都存放在一个索引下.这也就导致不同类型相同字段名字的字段会存在类型定义冲突的问题.

6. 文档(document)

文档是一个存储信息的基本单元,使用json来表示.比如,你可以拥有某一个客户的文档,某一个产品的一个文档,当然也可以拥有某个订单的一个文档.

文档以JSON(Javascript Object Notation)格式来表示,而JSON是一个到处存在的互联网数据交互格式.

一个document可以包含各种各样的数据,比如一条日志数据,一条订单数据,用JSON表示,每个index下的type中,都可以去存储多个document,一个document里面有多个field,每个field就是一个数据字段(相当于表中的一行).

#产品document:
{

"product_id": "1",

"product_name": "脑白金",

"product_desc": "老年人专用",

"category_id": "1",

"category_name": "保健品"
}

#这就是一个document,其实就是一个json.

7. 分片和复制(shards & replicas)

在ElasticSearch中,索引会备份成分片,每个分片是一个独立的lucene索引,可以完成搜索分析存储等工作.

一个索引可以存储超出单个结点硬件限制的大量数据.比如,一个具有10亿文档的索引占据1TB的磁盘空间,而任一节点都没有这样大的磁盘空间,或者单个节点处理搜索请求,响应太慢.

为了解决这个问题,es可以将一个索引中的数据切分为多个shard,这些shard就叫做分片,分布在多台服务器上存储.有了shard就可以横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,提升吞吐量和性能.每个shard都是一个lucene index.

分片之所以重要,主要有两方面的原因:

1️⃣.允许你水平分割/扩展你的内容容量;

2️⃣.允许你在分片(潜在地,位于多个节点上)之上进行分布式的、并行的操作,进而提高性能/吞吐量.

至于一个分片怎样分布,它的文档怎样聚合回搜索请求,是完全由Elasticsearch管理的,对于作为用户的你来说,这些都是透明的.

在一个网络/云的环境里,任何一个服务器随时可能故障或宕机,此时shard可能就会丢失.这种情况下,有一个故障转移机制是非常有用并且是强烈推荐的.因此可以为每个shard创建多个replica副本,replica可以在shard故障时提供备用服务,保证数据不丢失,多个replica还可以提升搜索操作的吞吐量和性能.分为primary shard(建立索引时一次设置,不能修改,默认5个)和 replica shard(随时修改数量,默认1个,这1个相当于5个,也就是说5个primary shard,5个replica shard).

复制之所以重要,主要有两方面的原因:
1️⃣.在分片/节点失败的情况下,提供了高可用性.
因为这个原因,所以复制分片从不与原/主要(original/primary)分片置于同一节点上是非常重要的.
2️⃣.扩展你的搜索量/吞吐量,因为搜索可以在所有的复制上并行运行.

总之每个索引可以被分成多个分片,一个索引也可以被复制0次(意思是没有复制)或多次.一旦复制了,每个索引就有了主分片(作为复制源的原来的分片)和复制分片(主分片的拷贝)之别.分片和复制的数量可以在索引创建的时候指定,在索引创建之后,你可以在任何时候动态地改变复制数量,但是不能改变分片的数量.

默认情况下,Elasticsearch中的每个索引被分片5个主分片和1个复制.这意味着,如果你的集群中至少有两个节点,你的索引将会有5个主分片和另外5个复制分片(1个完全拷贝),这样的话每个索引总共就有10个分片.一个索引的多个分片可以存放在集群中的一台主机上,也可以存放在多台主机上,这取决于你的集群机器数量,主分片和复制分片的具体位置是由ES内在的策略所决定的.

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一一哥Sun

您的鼓励是我继续创作的动力哦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值