elasticSearch基础认知(二)

先搞清楚一些术语,省的回头分不清哪跟哪

Term Posting List
Kate 1
John 2
Bill 3

term n.词条

Elasticsearch分别为每个field都建立了一个倒排索引,Kate, John, Bill这些叫term
索引里面最小的存储和查询单元,对于英文来说是一个单词,对于中文来说一般指分词后的一个词

term dictionary

Elasticsearch为了能快速找到某个term,将所有的term排个序,二分法查找term,logN的查找效率,就像通过字典查找一样,这就是Term Dictionary

term index

在Term Dictionary中的词由于是非常非常多的,所以我们会为其进行排序,等要查找的时候就可以通过二分来查不需要遍历整个Term Dictionary。

B-Tree通过减少磁盘寻道次数来提高查询性能,是采用同样的思路,直接通过内存查找term,不读磁盘由于Term Dictionary的词实在太多了,不可能把TermDictionary所有的词都放在内存中,于是Elasticsearch还抽了一层叫做Term Index。

这层只存储部分词的前缀,Term Index会存在内存中(检索会特别快)
Term Index在内存中是以FST(Finite State Transducers)的形式保存的,其特点是非常节省内存。

FST有两个优点
1)空间占用小。通过对词典中单词前缀和后缀的重复利用,压缩了存储空间;
2)查询速度快。O(len(str))的查询时间复杂度。

Elasticsearch的数据结构,如果所示

posting list(倒排表)

Elasticsearch分别为每个field都建立了一个倒排索引,,Kate, John, Bill这些叫term,而[1,2,3]就是Posting List。Posting list就是一个int的数组,存储了所有符合某个term的文档id。

NRT

Near Realtime,近实时,有两个层面的含义:

  • 是从写入一条数据到这条数据可以被搜索,有一段非常小的延迟(大约1秒左右);
  • 是基于Elasticsearch的搜索和分析操作,耗时可以达到秒级

cluster 集群

集群由一至多个节点组成, 对外提供索引和搜索服务. 一个节点只能加入到一个集群中.
集群中有且只能有一个节点会被选举为主节点 —— 主从节点是集群内部的说法, 对用户是透明的; ES做到了去中心化: 访问任一节点等价于访问整个集群.
同一网络中, 每个ES集群都要有唯一的名称用于区分, 默认的集群名称为"elasticsearch".
水平扩展时, 只需要将新增节点的集群名称设置为要扩容的集群名称, 该节点就会自动加入集群中.

node 节点

节点是逻辑上独立的服务, 是集群的一部分, 可以存储数据, 并参与集群的索引和检索功能.
节点也有唯一的名称, 用于集群的管理和通信, 节点名称在节点启动时自动分配一个随机的UUID的前7个字符 —— 当然可以自定义.
如果有多个节点在运行, 默认情况下, 这些节点会自动组成一个名为Elasticsearch的集群.
[如果只有一个节点在运行, 该节点就会组成只有一个节点的名为Elasticsearch的集群.]( "如果只有一个节点在运行, 该节点就会组成只有一个节点的名为Elasticsearch的集群.")
每个节点属于哪个集群是通过"集群名称"来决定的.

shard 分片

ES 支持 PB 级全文搜索,当索引上的数据量太大的时候,ES 通过水平拆分的方式将一个索引上的数据拆分出来分配到不同的数据块上,拆分出来的数据库块称之为一个分片。

这类似于 MySQL 的分库分表,只不过 MySQL 分库分表需要借助第三方组件而 ES 内部自身实现了此功能。

在一个多分片的索引中写入数据时,通过路由来确定具体写入哪一个分片中,所以在创建索引的时候需要指定分片的数量,并且分片的数量一旦确定就不能修改。

分片的数量和下面介绍的副本数量都是可以通过创建索引时的 Settings 来配置,ES 默认为一个索引创建 5 个主分片, 并分别为每个分片创建一个副本。

PUT /myIndex
{
    "settings": {
        "number_of_shards": 5,
        "number_of_replicas": 1
    }
}

replica 副本

副本就是对分片的 Copy,每个主分片都有一个或多个副本分片,当主分片异常时,副本可以提供数据的查询等操作。

主分片和对应的副本分片是不会在同一个节点上的,所以副本分片数的最大值是 N-1(其中 N 为节点数)。

对文档的新建、索引和删除请求都是写操作,必须在主分片上面完成之后才能被复制到相关的副本分片。

ES 为了提高写入的能力这个过程是并发写的,同时为了解决并发写的过程中数据冲突的问题,ES 通过乐观锁的方式控制,每个文档都有一个 _version (版本)号,当文档被修改时版本号递增。

一旦所有的副本分片都报告写成功才会向协调节点报告成功,协调节点向客户端报告成

recovery

在Eleasticsearch中recovery指的就是一个索引的分片分配到另外一个节点的过程;
一般在快照恢复、索引副本数变更、节点故障、节点重启时发生。

gateway

gateway的主要职责是用来对数据进行长持久化,另外,整个集群重启之后可以通过gateway重新恢复数据。
ES索引的持久化存储方式, 也就是各类文件系统. 默认是先把索引存放到内存中, 当内存满了时再持久化到硬盘.
ES集群重新启动时就会从gateway中读取索引数据.
ES支持多种类型的gateway: 本地文件系统(默认), 分布式文件系统, Hadoop的HDFS, 以及Amazon的S3云存储服务等.

settings

Mapping,就是对索引库中索引的字段名称及其数据类型进行定义,类似于mysql中的表结构信息。
不过es的mapping比数据库灵活很多,它可以动态识别字段。一般不需要指定mapping都可以,因为es会自动根据数据格式识别它的类型,如果你需要对某些字段添加特殊属性(如:定义使用其它分词器、是否分词、是否存储等),就必须手动添加mapping

设置索引分片数,默认为1,只能在创建索引时设置,之后任何时候都不能修改
"number_of_shards": 3,
设置索引分片副本数,默认为1,之后可以任意修改
"number_of_replicas": 1,
刷新间隔,默认1s,近实时,文档从索引到可以被检索中间间隔就是这个值
"refresh_interval": "1s",

mapping 映射

映射是用于定义 ES 对索引中字段的存储类型、分词方式和是否存储等信息,就像数据库中的 Schema ,描述了文档可能具有的字段或属性、每个字段的数据类型。

只不过关系型数据库建表时必须指定字段类型,而 ES 对于字段类型可以不指定然后动态对字段类型猜测,也可以在创建索引时具体指定字段的类型

dynamic mapping 动态映射

动态映射来确定字段的数据类型,并自动把新的字段添加到类型映射。
具体看这个链接:https://www.cnblogs.com/Neeo/articles/10585035.html

参考链接:https://www.cnblogs.com/Neeo/articles/10585035.html
https://www.elastic.co/guide/cn/elasticsearch/guide/current/dynamic-mapping.html
https://www.sohu.com/a/433823534_120948229

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注