#<center> Elasticsearch核心技术(2)--- 基本概念</center>node
这篇博客讲到基本概念包括: Index、Type、Document。集群,节点,分片及副本,倒排索引。数据库
##<font color=#FFD700> 1、Index、Type、Document</font>服务器
一、Index
index
:索引是文档(Document)的容器,是一类文档的集合。分布式
索引这个词在 ElasticSearch 会有三种意思:性能
1)、索引(名词)ui
类比传统的关系型数据库领域来讲,索引至关于SQL中的一个数据库(Database)
。索引由其名称(必须为全小写字符)进行标识。搜索引擎
2)、索引(动词)url
保存一个文档到索引(名词)的过程
。这很是相似于SQL语句中的 INSERT关键词。若是该文档已存在时那就至关于数据库的UPDATE。spa
3)、倒排索引.net
关系型数据库经过增长一个B+树索引到指定的列上,以便提高数据检索速度。索引ElasticSearch 使用了一个叫作 倒排索引
的结构来达到相同的目的。
二、Type
Type
能够理解成关系数据库中Table。
以前的版本中,索引和文档中间还有个类型的概念,每一个索引下能够创建多个类型,文档存储时须要指定index和type。从6.0.0开始单个索引中只能有一个类型,
7.0.0之后将将不建议使用,8.0.0 之后彻底不支持。
弃用该概念的缘由:
咱们虽然能够通俗的去理解Index比做 SQL 的 Database,Type比做SQL的Table。但这并不许确,由于若是在SQL中,Table 以前相互独立,同名的字段在两个表中毫无关系。
可是在ES中,同一个Index 下不一样的 Type 若是有同名的字段,他们会被 Luecence 看成同一个字段 ,而且他们的定义必须相同。因此我以为Index如今更像一个表,
而Type字段并无多少意义。目前Type已经被Deprecated,在7.0开始,一个索引只能建一个Type为_doc
三、Document
Document
Index 里面单条的记录称为Document(文档)。等同于关系型数据库表中的行。
咱们来看下一个文档的源数据
<img src="https://img2018.cnblogs.com/blog/1090617/201909/1090617-20190902193404423-175527959.jpg" style="border: 1px dashed rgb(204, 200, 200);" width="700" height="256">
_index
文档所属索引名称。
_type
文档所属类型名。
_id
Doc的主键。在写入的时候,能够指定该Doc的ID值,若是不指定,则系统自动生成一个惟一的UUID值。
_version
文档的版本信息。Elasticsearch经过使用version来保证对文档的变动能以正确的顺序执行,避免乱序形成的数据丢失。
_seq_no
严格递增的顺序号,每一个文档一个,Shard级别严格递增,保证后写入的Doc的_seq_no
大于先写入的Doc的_seq_no。
primary_term
primary_term也和_seq_no
同样是一个整数,每当Primary Shard发生从新分配时,好比重启,Primary选举等,_primary_term会递增1
found
查询的ID正确那么ture, 若是 Id 不正确,就查不到数据,found字段就是false。
_source
文档的原始JSON数据。
<br>
##<font color=#FFD700> 2、集群,节点,分片及副本</font>
一、集群
ElasticSearch集群其实是一个分布式系统,它须要具有两个特性:
1)高可用性
a)服务可用性:容许有节点中止服务;
b)数据可用性:部分节点丢失,不会丢失数据;
2)可扩展性
随着请求量的不断提高,数据量的不断增加,系统能够将数据分布到其余节点,实现水平扩展;
一个集群中能够有一个或者多个节点;
集群健康值
green
:全部主要分片和复制分片均可用yellow
:全部主要分片可用,但不是全部复制分片均可用red
:不是全部的主要分片均可用
当集群状态为 red,它仍然正常提供服务,它会在现有存活分片中执行请求,咱们须要尽快修复故障分片,防止查询数据的丢失;
二、节点(Node)
1)节点是什么?
a)节点是一个ElasticSearch的实例,其本质就是一个Java进程;
b)一台机器上能够运行多个ElasticSearch实例,可是建议在生产环境中一台机器上只运行一个ElasticSearch实例;
Node 是组成集群的一个单独的服务器,用于存储数据并提供集群的搜索和索引功能。与集群同样,节点也有一个惟一名字,默认在节点启动时会生成一个uuid做为节点名,
该名字也能够手动指定。单个集群能够由任意数量的节点组成。若是只启动了一个节点,则会造成一个单节点的集群。
三、分片
Primary Shard(主分片)
ES中的shard用来解决节点的容量上限问题,,经过主分片,能够将数据分布到集群内的全部节点之上。
它们之间关系
一个节点对应一个ES实例; 一个节点能够有多个index(索引); 一个index能够有多个shard(分片); 一个分片是一个lucene index(此处的index是lucene本身的概念,与ES的index不是一回事);
主分片数是在索引建立时指定,后续不容许修改,除非Reindex
一个索引中的数据保存在多个分片中(默认为一个),至关于水平分表。一个分片即是一个Lucene 的实例,它自己就是一个完整的搜索引擎。咱们的文档被存储和索引到分片内,
可是应用程序是直接与索引而不是与分片进行交互。
Replica Shard(副本)
副本有两个重要做用:
一、服务高可用:因为数据只有一份,若是一个node挂了,那存在上面的数据就都丢了,有了replicas,只要不是存储这条数据的node全挂了,数据就不会丢。所以分片副本不会与
主分片分配到同一个节点;
二、扩展性能:经过在全部replicas上并行搜索提升搜索性能.因为replicas上的数据是近实时的(near realtime),所以全部replicas都能提供搜索功能,经过设置合理的replicas
数量能够极高的提升搜索吞吐量
分片的设定
对于生产环境中分片的设定,须要提早作好容量规划,由于主分片数是在索引建立时预先设定的,后续没法修改。
分片数设置太小
致使后续没法增长节点进行水平扩展。
致使分片的数据量太大,数据在从新分配时耗时;
分片数设置过大
影响搜索结果的相关性打分,影响统计结果的准确性;
单个节点上过多的分片,会致使资源浪费,同时也会影响性能;
<br>
##<font color=#FFD700> 3、倒排索引</font>
ES的搜索功能是基于lucene,而lucene搜索的基本原理就是倒叙索引,倒序排序的结果跟分词的类型有关
。
举例
一、假设文档集合包含五个文档,毎个文档内容如图所示,在图中最左端一栏是每一个文档对应的文挡编号。
如图(盗图)
<img src="https://img2018.cnblogs.com/blog/1090617/201909/1090617-20190902193443923-627329584.png" style="border: 1px dashed rgb(204, 200, 200);" width="700" height="413">
二、首先要用分词系统将文挡自动切分红单词序列,记录下哪些文挡包含这个单词,在如此处理结束后,咱们能够获得最简单的倒排索引。
<img src="https://img2018.cnblogs.com/blog/1090617/201909/1090617-20190902193452496-1005095299.png" style="border: 1px dashed rgb(204, 200, 200);" width="700" height="510">
三、索引系统还能够记录除此以外的更多信息,下图还记载了单词频率信息。文档中的句子被划分为一个个term(term 用来表示一个单词或词语,取决于使用的分词方式
),
倒叙索引
中存储着term,term的出现频率(tf,term frequency)和出现位置(倒叙索引中的单词是按顺序排列的,这张图没有体现出来
),请注意这里的文档内容是document
中的一个字段,也就是说每一个被索引了的字段都有本身的倒叙索引
<img src="https://img2018.cnblogs.com/blog/1090617/201909/1090617-20190902193500716-1883467765.png" style="border: 1px dashed rgb(204, 200, 200);" width="700" height="470">
一次简单的搜索流程
假设咱们搜索谷歌地图之父
,搜索流程会是这样
- 分词,分词插件将句子分为3个term
谷歌
,地图
,之父
- 将这3个term拿到倒叙索引中去查找(会很高效,好比二分查找),若是匹配到了就拿对应的文档id,得到文档内容
可是,如何肯定结果顺序?
这里要引入_score的概念,对于term的匹配,lucene会对其打分,得分越高,排名越靠前.这里要介绍几个相关的概念
- TF(term frequency),词频,term在当前document中出现的频率,一个term在当前document中出现5次要比出现1次更相关,打分也会更高 - IDF(inverse doucment frequency),逆向文档频率,term在全部document中出现的频率,这个频率越高,该term对应的分值越低 - 字段长度归一值,简单来讲就是字段越短,字段的权重越高, 好比 term `我`在匹配 `我123`和`我123456`时,`我123`的得分会更高.
<br> ### <font color=#FFD700> 参考</font>
一、Elasticsearch核心技术与实战---阮一鸣(eBay Pronto平台技术负责人
<br> <br>
我相信,不管从此的道路多么坎坷,只要抓住今天,早晚会在奋斗中尝到人生的甘甜。抓住人生中的一分一秒,赛过虚度中的一月一年!(8)
<br>