elasticsearch学习日志—es中的一些基本概念

elasticsearch中的一些基本概念

这一部分记录下elasticsearch当中的一些专用的基本概念,首先是es使用当中的文档和索引:

文档(Document):
  • elasticsearch是面向文档的,文档是所有可搜索数据的最小单元,可类比关系型数据库中的一条记录。

  • 文档会被序列化成JSON格式,保存在Elasticsearch中。JSON对象由字段组成,每个字段都有对应的字段类型。elasticsearch可自动推算字段的类型。但在实际使用当中可能会与实际需要存在一些误差,因此在一些情况下需要手动指定字段的类型。

  • 每个文档都有一个 Unique ID, 可自己指定也可由elasticsearch自动生成。


    image.png
  • 元数据,用于标注文档的相关信息,包括:

    • _index : 文档所属的索引名
    • _type :文档所属的类型名
    • _id : 文档唯一id
    • _score : 相关性打分
    • _source : 文档的原始JSON数据
    • _version : 文档的版本信息

索引(index):
image.png
  • 索引是文档的容器,是一类文档的结合,由于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字段进行倒排索引:


image.png

doc id:文档的id。
TF:单词出现的频率。
Position:单词出现的位置。
Offset:单词的开始和结束位置。

elasticsearch当中的分词

那么既然谈到了倒排索引,就需要探讨一下需要对哪些单词进行倒排索引,这就涉及到了分词,举个例子,假设有一个文档:
“小明今天出门没有带雨伞”。
对于其中的一些汉字组合如: 明今,门没,带雨等这类单独组起来没有任何意义的词组,其实是完全没必要为他们创建倒排索引的,因此,我们希望能够有一个合理的分词方式,以减少创建过多的无谓的倒排索引。这里引入几个概念

  • Analysis - 文本分析,是把全部文本转换为一系列单词(term/token)的过程,也就是我们所谓的分词。
  • Analyzer - 分词器,上述的分词的过程是通过分词器来完成的。elasticsearch当中有内置的分词器,也可按需定制分词器。此外,分词器还会作用在查询语句上,对查询语句进行分析。
    分词器由三部分组成:
  • Character Filter:针对原始文本处理,做一些诸如去除html标签的工作。
  • Tokenizer:按照一定的规则将文本切分为单词。
  • Token filter:将处理后的单词进行二次加工,如转化为小写,删除stopwords(一些去掉后对语义影响不大的词或一些在哪里都会出现的词),同义词转换,词干提取等。


    image.png

分词器api,可用来查看对text文本分词后的结果。es内置了一些分词器:

  • standard 标准分词器,按词切分,小写处理。
  • simple 按照非字母切分,小写处理。
  • stop 在simple的基础上,过滤掉stopword。
  • whitespace 按空格切分,不转小写。
  • keyword 不做分词处理,整个输入作为分词结果。
  • pattern 正则表达式分词,默认按 /W+
  • language 提供了一些常用语言的分词器。
    另外对于中文的分词器推荐使用IK和THULAC。

你可能感兴趣的:(elasticsearch学习日志—es中的一些基本概念)