elasticsearch中的一些基本概念
这一部分记录下elasticsearch当中的一些专用的基本概念,首先是es使用当中的文档和索引:
文档(Document):
elasticsearch是面向文档的,文档是所有可搜索数据的最小单元,可类比关系型数据库中的一条记录。
文档会被序列化成JSON格式,保存在Elasticsearch中。JSON对象由字段组成,每个字段都有对应的字段类型。elasticsearch可自动推算字段的类型。但在实际使用当中可能会与实际需要存在一些误差,因此在一些情况下需要手动指定字段的类型。
-
每个文档都有一个 Unique ID, 可自己指定也可由elasticsearch自动生成。
-
元数据,用于标注文档的相关信息,包括:
- _index : 文档所属的索引名
- _type :文档所属的类型名
- _id : 文档唯一id
- _score : 相关性打分
- _source : 文档的原始JSON数据
- _version : 文档的版本信息
索引(index):
- 索引是文档的容器,是一类文档的结合,由于type即将废除,那么索引在此可类比关系型数据库中的表。
- mapping:定义文档的字段类型。
- setting: 定义不同的数据分布。
其次,由于elasticsearch的分布式特性,因此有一些与分布式相关的名词:
节点(node):
- 节点是一个es的实例,本质上就是一个java的进程,一台机器上可运行多个实例,但是在生产环节建议一台机器只设置一个。
- 每个节点都有一个名字,可通过配置文件配置。
- 每一个节点启动后会分配一个UID,保存在data目录下
- master node:
每个节点启动后,默认为 master eligible节点,这种类型的节点可参加选主流程,成为master节点,可以在配置文件中设置 node.master: false来禁止。
第一个节点启动后会将自己选举为主节点,每个节点上都保存了集群的状态,只有master节点才能修改集群的状态信息。
集群的状态信息包括:所有的节点信信;所有索引及其相关的setting和mapping信息;分片的路由信息等。 - data node:
可以保存数据的节点,叫做data node。负责保存分片数据。在数据扩展上起到了至关重要的作用 - Coordinating node:
负责接受Client的请求,将请求发送给合适的节点,最终将数据汇总在一起。
每个node默认都起到了coordinating node的指责。
另外还有一些其他节点类型: - hot&warm node(冷热节点):
不同硬件配置的 data node,用来实现 HOT & WARM 架构,降低集群部署成本。 - machine learning node:
负责跑机器学习的node, 用来做异常检测。
分片(Primary Shard & Replica Shard)
- 主分片:用以解决数据水平扩展的问题。通过主分片,可以将数据分布到集群内的所有节点之上。
- 一个分片是一个运行的lucene实例。
- 主分片数在创建索引时指定,后续不允许修改,除非reindex。
- 副本分片:用以解决数据高可用的问题,是主分片的拷贝。
- 副本分片数可以动态调整。
- 增加副本数,还可以一定程度上提高服务的可用性。
对于生产环境中分片的设定,需要提前做好容量规划:
分片数过小会导致后续无法增加节点实现水平扩展,同时单个分片的数据量过大会造成数据重新分配耗时的增加。
分片数过大会影响搜索结果的相关性打分,影响统计结果的准确性。单个节点上过多的分片也会导致资源的浪费,同时影响性能。
集群的健康状态:
可通过API命令查看集群健康状态:
###查看集群健康状态
GET _cluster/health
###查看节点信息
GET _cat/nodes
###查看分片信息
GET _cat/shards
green代表主分片与副本分片都正常分配;yellow表示主分片正常,副本分片不正常;red表示有未能分配
另外可通过Cerebro来监控管理elasticsearch集群状态。
其他一些小知识:
倒排索引
elasticsearch采用一种名为倒排索引的结构,适用于快速的全文检索。一个倒排 索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表,如以下例子,对elasticsearch字段进行倒排索引:
doc id:文档的id。
TF:单词出现的频率。
Position:单词出现的位置。
Offset:单词的开始和结束位置。
elasticsearch当中的分词
那么既然谈到了倒排索引,就需要探讨一下需要对哪些单词进行倒排索引,这就涉及到了分词,举个例子,假设有一个文档:
“小明今天出门没有带雨伞”。
对于其中的一些汉字组合如: 明今,门没,带雨等这类单独组起来没有任何意义的词组,其实是完全没必要为他们创建倒排索引的,因此,我们希望能够有一个合理的分词方式,以减少创建过多的无谓的倒排索引。这里引入几个概念
- Analysis - 文本分析,是把全部文本转换为一系列单词(term/token)的过程,也就是我们所谓的分词。
- Analyzer - 分词器,上述的分词的过程是通过分词器来完成的。elasticsearch当中有内置的分词器,也可按需定制分词器。此外,分词器还会作用在查询语句上,对查询语句进行分析。
分词器由三部分组成: - Character Filter:针对原始文本处理,做一些诸如去除html标签的工作。
- Tokenizer:按照一定的规则将文本切分为单词。
-
Token filter:将处理后的单词进行二次加工,如转化为小写,删除stopwords(一些去掉后对语义影响不大的词或一些在哪里都会出现的词),同义词转换,词干提取等。
分词器api,可用来查看对text文本分词后的结果。es内置了一些分词器:
- standard 标准分词器,按词切分,小写处理。
- simple 按照非字母切分,小写处理。
- stop 在simple的基础上,过滤掉stopword。
- whitespace 按空格切分,不转小写。
- keyword 不做分词处理,整个输入作为分词结果。
- pattern 正则表达式分词,默认按 /W+
- language 提供了一些常用语言的分词器。
另外对于中文的分词器推荐使用IK和THULAC。