1.RESTful风格程序
REST(英文全称为:"Representational State Transfer")指的是一组架构约束条件和原则。它是一种软件架构风格(约束条件和原则的集合,但并不是标准)。
REST通过资源的角度观察网络,以URI对网络资源进行唯一标识,响应端根据请求端的不同需求,通过无状态通信,对其请求的资源进行表述。
满足REST约束条件和原则的架构或接口,就被称为是RESTful架构或RESTful接口。
Web应用程序最重要的REST原则是:
(1)客户端和服务器之间的交互在请求之间是无状态的;
(2)从客户端到服务器的每个请求都必须包含理解请求所必需的信息;
(3)如果服务器在请求之间的任何时间点重启,客户端不会得到通知;
(4)无状态请求可以由任何可用服务器回答,这十分适合云计算之类的环境,客户端可以缓存数据以改进性能。
在服务器端,应用程序状态和功能可以分为各种资源。资源是一个有趣的概念实体,它向客户端公开。资源的例子有:应用程序对象、数据库记录、算法等等。
每个资源都使用URI(Universal Resource Identifier)得到一个唯一的地址。
所有资源都共享统一的接口,以便在客户端和服务器之间传输状态。使用的是标准的HTTP方法,比如GET、PUT、POST和DELETE等。
我们可以向Elasticsearch发送数据或者其返回数据均是JSON(英文全称为:"JavaScript Object Notation")格式。
2.JSON快速入门
java
什么是JSON:
JSON是一种轻量级的文本数据交换格式而非编程语言,其语法只支持字符串,数值,布尔值及null以及在此基础上的对象和数组。
举个例子:
基础数据类型(支持的基础数据类型参考下表):
name = "oldboy"
age = 43
数组:
teachers = ["oldboy", "苍老师","加藤鹰","小园梨央"]
对象:
obs = {
"name": "oldboy",
"age":43,
"habby":"linux,象棋,跑步"
}
推荐阅读:
https://www.w3cschool.cn/json/json-intro.html
数据类型 | 举例 | 说明 |
---|---|---|
字符串 | "oldboy" | 使用双引号引用字符串 |
数值 | 2021 | 值得注意的是,如果使用双引号"2021",则其为字符串而非数字哟~ |
布尔值 | true/false | 只有真(true)和假(false)两个值。 |
空值 | null | 表示一个空值。 |
1.文档(Document)
文档就是用户存在ElasticSearch的一些数据,它是ElasticSearch中存储数据的最小单元。
文档类似于MySQL数据库中表中的一行数据。每个文档都有唯一的"_id"标识,我们可以自定义"_id"(不推荐),如果不指定ES也会自动生成。
一个文档是一个可被索引的基础信息单元,也就是一条数据。在一个"index/_doc"里面,我们可以存储任意多的文档。
文档是以JSON(Javascript Object Notaion)格式来表示,而JSON是一个到处存在的互联网数据交互格式。
JSON比XML更加轻量级,目前JSON已经成为互联网事实的数据交互标准了,几乎是所有主流的编程语言都支持。
2.字段(Filed)
相当于数据库表的字段,对文档数据根据不同属性进行的分类标识。
在ES中,Document就是一个Json Object,一个json objec其实是由多个字段组成的,每个字段它由不同的数据类型。
推荐阅读:
https://www.elastic.co/guide/en/elasticsearch/reference/7.12/mapping-types.html
3.索引(index)
一个索引就是一个拥有相似特征的文档(Document)的集合。假设你的公司是做电商的,可以将数据分为客户,产品,订单等多个类别,在ES数据库中就对应多个索引。
ES索引、文档、字段关系小结:
一个索引里面存储了很多的Document 文档,一个文档就是一个json object,一个json object是由多个不同的filed字段组成;
Elasticsearch索引的精髓:一切设计都是为了提高搜索的性能。换句话说,在ES存储的数据,万物皆索引,如果数据没有索引则无法查询数据。
4.分片(Shards)----> (先讲解上面3个概念)
我们假设平均1个文档占用2k大小,那么按照utf-8对中文的字符编码,该文档能存储682(2 * 1024 / 3)个汉字。
如果我们要存储30亿条数据,则需要使用5722GB(3000000000 * 2k,不足6T)存储空间,
一个索引可以存储超出单个节点硬件限制的大量数据。比如,一个具有30亿文档数据的索引占据6TB的磁盘空间。
如果一个集群有3台服务器,单个节点的磁盘存储空间仅有4T磁盘空间,很明显某一个节点是无法存储下6TB数据的。或者单个节点处理搜索请求,响应太慢。
为了解决这个问题,elasticsearch提供了将索引划分成多份的能力,每一份都称之为分片。
当你创建一个索引的时候,你可以指定你想要的分片数量。每个分片本身也是一个功能完善并且独立的"索引",这个"索引"可以被放置到集群中的任何节点上。
分片很重要,主要有两方面的原因:
(1)允许你水平分割/扩展你的内容容量,当然你也可以选择垂直扩容;
(2)允许你在各节点上的分片进行分布式,并行的操作,从而显著提升性能(包括但不限于CPU,内存,磁盘,网卡的使用),最显著的是吞吐量的提升;
至于一个分片怎么分布,它的文档怎样聚合和搜索请求,是完全由elasticsearch管理的,对于作为用户的你来说,这些都是透明的,无需过分关心。
温馨提示:
一个Lucene索引我们在Elasticsearch称作分片。
一个ElasticSearch索引是分片的集合。
当ElasticSearch在索引中搜索的时候,她发送查询到每一个属于索引的分片(Lucene索引),然后合并每个分片的结果到一个全局的结果集。
5.副本(Replicas)
无论是在公司内部的物理机房,还是在云环境中,节点故障随时都有可能发生,可能导致这些故障的原因包括但不限于服务器掉电,Raid阵列中的磁盘损坏,网卡损坏,同机柜交换机损坏等。
在某个分片/节点不知为何就处于离线状态,或者由于任何原因消失了,这种情况下,有一个故障转移机制是非常有用并且是强烈推荐的。
为此目的,elasticsearch允许你创建分片的一份或多份拷贝,这些拷贝叫做复制分片(我们也习惯称之为"副本")。
副本之所以重要,主要有以下两个原因:
(1)在分片/节点失败的情况下,提供了高可用性。因为这个原因,注意到复制分片从不与主分片(primary shard)置于同一个节点上是非常重要的;
(2)扩展你的搜索量/吞吐量,因为搜索可以在所有的副本上并行运行;
总之,每个索引可以被分配成多个分片。一个索引也可以被复制0次(意思是没有副本分片,仅有主分片)或多次。
一旦复制了,每个索引就有了主分片(作为复制源的原来的分片)和复制分片(主分片的拷贝)之别。分片和复制的数量可以在索引创建的时候指定。
在索引创建之后,你可以在任何时候动态地改变复制的数量,但是你事后不能改变分片的数量。
默认情况下,elasticsearch中的每个索引被分片1个主分片和1个复制分片,这样的话一个索引总共就有2个分片,我们需要根据索引需求确定分片个数。
6.分配(Allocation)
所谓的分配就是将分片分配给某个节点的过程,包括主分片或者副本。如果是副本,还包含从主分片复制数据的过程,这个过程由master节点完成的。
7.类型(type)
在elasticsearch 5.x及更早的版本,在一个索引中,我们可以定义一种或多种类型。但在ES 7.x版本中,仅支持"_doc"类型。
一个索引是你的索引的一个逻辑上的分类/分区,其语义完全由你来定,通常,会为具有一组共同字段的文档定义一个类型。
8.映射(Mapping)
mapping是处理数据的方式和规则方面做一些限制,如:某个字段的数据类型,默认值,分析器,是否被索引等等。
这些都是映射里面可以设置的,其它就是处理ES里面数据的一些使用规则设置也叫做映射。
按着最优规则处理数据对性能提高很大,因此才需要建立映射,并且需要思考如何建立映射才能对性能更好。
值得注意的是,课程后面有相应的案例哟~
9.DSL概述
Elasticsearch提供丰富且灵活的查询语言叫做DSL查询(Query DSL),它允许你构建更加复杂,强大的查询。
DSL(Domain Specific Language特定领域语言)以JSON请求体的形式出现。
值得注意的是,下面由相关的案例。