学习目标
熟悉ES中index,shard,type,document,倒排索引等概念以及Client API。
作用
- 高度可扩展的开源全文搜索与分析引擎
- 快速地、近实时的对大数据进行存储、搜索与分析
- 用来支撑有负责的数据搜索需求的企业级应用
- 一个分布式可扩展的实时搜索和分析引擎
- 一切的设计都是为了提高搜索的性能(为了提高搜索能力,在插入或者更新方面可能比较慢)
特点
- 分布式
- 高可用
- 多类型
- 多API
- 面向文档
- 异步写入
- 近实时
- 基于Lucene
- Apache协议
核心概念
- 近实时
集群
- 代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。
es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,
你与任何一个节点的通信和与整个es集群通信是等价的。
- 代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。
节点
- 代表es的自动发现节点机制,es是一个基于p2p的系统,它先通过广播寻找存在的节点,再通过多播协议来进行节点之间的通信,
同时也支持点对点的交互。
- 代表es的自动发现节点机制,es是一个基于p2p的系统,它先通过广播寻找存在的节点,再通过多播协议来进行节点之间的通信,
- 索引
- 类型
- 文档
- 一般搜索引擎的处理对象是互联网网页,而文档这个概念要更宽泛些,代表以文本形式存在的存储对象,相比网页来说,涵盖
更多种形式,比如Word,PDF,html,XML等不同格式的文件都可以称之为文档。再比如一封邮件,一条短信,一条微博也可以称
之为文档。很多情况下会使用文档来表征文本信息。(在Elasticsearch中,文档这个单词有特殊的含义。它指的是在Elasticsearch
中被存储到唯一ID下的由最高级或者根对象 (root object )序列化而来的JSON。),在ES中一条数据Json数据就是一个文档:
- 一般搜索引擎的处理对象是互联网网页,而文档这个概念要更宽泛些,代表以文本形式存在的存储对象,相比网页来说,涵盖
{
"name" : "John",
"sex" : "Male",
"age" : 25,
"birthDate": "1990/05/01",
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
}
可以表示为User类型
- 分片
- 代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。
构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。
- 代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。
- 副本
- 代表索引副本,es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中
恢复。 - 二是提高es的查询效率,es会自动对搜索请求进行负载均衡。
- 代表索引副本,es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中
传统数据库与ES之间的映射关系
关系型数据库 | ES |
---|---|
DataBase | index |
Table | type |
Row | Document |
Column | Field |
Schema | Mapping |
Index | Everything is indexed |
SQL | Query DSL |
SELECT * FROM table | GET http:// |
UPDATE table SET | PUT http:// |
REST请求头
HTTP方法 | 数据处理 | 说明 |
---|---|---|
POST | Create | 新增一个没有ID的资源 |
GET | Read | 取得一个资源 |
PUT | Update | 更新一个资源,或者新增一个含ID的资源(如果ID不存在) |
DELETE | Delete | 删除一个资源 |
版本控制
ES提供了两种最为重要的版本控制类型:
- 内部版本是以1开头的默认版本,每次对内容的更新都会增加,包括删除
- 外部版本需要进行配置,version_type设置为external
端口
- 9300 专门供Java使用的端口
- 9200 供其他编程语言调用的端口
批量提交的原理:聚集一定数量的doc,然后发送一次添加请求!
Elasticsearch对复杂分布式机制的透明隐藏特性
- Elasticsearch是一套分布式的系统,分布式是为了应对大数据量
- 隐藏了复杂的分布式机制
- cluster discovery(集群发现机制)—–比如当前我们启动了一个es进程,当启动了第二个es进程时,这个进程作为一个node自动就
发现了集群,并且加入了进去,还接受了部分数据(作为replica shard)
分片机制—-es自动地将我们创建的document插入的集群中,我们是不用关心数据是按照什么机制分片的、最后放入到那个shard中 - shard负载均衡—–比如现在又10shard,集群中有3个节点,es会进行均衡的进行分配,以保持每个节点均衡的读写负载请求
ElasticSearch修改文档原理
- 从旧的文档中检索JSON
- 修改它
- 删除修的文档(不会立即删除,但是也不能被检索到)
- 索引一个新的文档
高可用方案(保证数据一致性)
- 悲观并发控制(在读取特定行数据时,先对这行数据进行锁定,确保只有一个线程可以对这行数据进行操作)
- 乐观并发控制:ElasticSearch所采用的方案。假设这种情况并不会经常发生,也不会去阻止某一数据的访问。然而,如果基础数据在我们
读取和写入的间隔中发生了变化,更新就会失败。这时候就由程序来决定如何处理这个冲突。例如,它可以重新读取新数据来进行更新,
又或者它可以将这一情况直接反馈给用户。
查询结果参数说明
- hits:指明了匹配查询的文档总数
- _score:每一个元素还拥有一个_score字段。这个是相关性评分,这个数值表示当前文档与查询的匹配程度。通常来说,搜索结果会先返回最匹配
的文档,也就是说它们会按照_score由高至低进行排列。在这个例子中,我们并没有声明任何查询,因此_score就都会返回1 - took:我们执行这次搜索请求所耗费的时间有多少毫秒。
- shards:告诉我们参与查询分片的总数
- timed_out:数值告诉了我们查询是否超时,会尽可能地返回你指定时间内它所查到的内容(这里应该强调一下timeout并不会终止查询,
它只是会在你指定的时间内返回当时已经查询到的数据,然后关闭连接。在后台,其他的查询可能会依旧继续,尽管查询结果已经被返回了。)
查询URL说明
URL | 说明 |
---|---|
/_search | 搜索所有的索引和文档 |
/index/_search | 搜索索引index中的所有类型 |
/index1,index2/_search | 搜索索引index1和index2中的所有文档和类型 |
/index1*,index2*/_search | 搜索所有以index1和index2开头的所有文档和类型 |
/index/type/_search | 搜索索引index中类型为type中的所有文档 |
/index1,index2/type1,type2/_search | 搜索索引index1和索引index2中的类型为type1或者为type2中的所有文档 |
/_all/type1,type2/_search | 搜索所有类型为type1以及type2中的文档 |
分片(Shard)和副本(Replica)
- ES的“分片(shard)”机制可将一个索引内部的数据分布地存储于多个节点,它通过将一个索引切分为多个底层物理的Lucene索引完
成索引数据的分割存储功能,这每一个物理的Lucene索引称为一个分片(shard)。 - 每个分片其内部都是一个全功能且独立的索引,因此可由集群中的任何主机存储。创建索引时,用户可指定其分片的数量,默认数量为5个。
- Shard有两种类型:primary和replica,即主shard及副本shard。
- Primary shard用于文档存储,每个新的索引会自动创建5个Primary shard,当然此数量可在索引创建之前通过配置自行定义,不过,一旦创建完成,其Primary shard的数量将不可更改。
- Replica shard是Primary Shard的副本,用于冗余数据及提高搜索性能。
每个Primary shard默认配置了一个Replica shard,但也可以配置多个,且其数量可动态更改。ES会根据需要自动增加或减少这些Replica shard的数量。 - ES集群可由多个节点组成,各Shard分布式地存储于这些节点上。ES可自动在节点间按需要移动shard,例如增加节点或节点故障时。简而言之,分片实现了集群的分布式存储,而副本实现了其分布式处理及冗余功能。
基本概念
- 索引
- ES将它的数据存储在一个或者多个索引中,可以向索引中写入数据,也可以从索引中读取数据,类似SQL中的数据库
- 文档
- 文档是ES中的主要实体,对所有使用ES搜索的案例来说,最后都将转化为文档的搜索