ES (7.10.2)学习系列之 简介及基本概念

435 阅读6分钟

1.为什么使用ES

  1. 速度快!ES使用了有限状态转换器实现了用于全文检索的倒排索引,实现了用于存储数值数据和地理位置数据的BKD树,以及用于分析的列存储。并且由于ES默认就是将所有的字段全部建立索引,所以我们在查询的时候可以实时地检索到数据。
  2. 我们在使用查询的时候不仅仅是将数据查询出来,ES还能将关键词检索到的数据根据相关度排名
  3. 完整的生态性。ElasticSearch是Elastic公司的核心技术栈,他们还包括Logstash、Filebeat、Kibana等等。我们可以使用ES提供的技术栈,实现各种目的,比如典型的采用ELK + Filebeat搭建一套分布式日志采集系统,将各个微服务的日志通过Filebeat收集推送到Logstash管道做处理,然后logstash推送给ES,最终Kibana展示,查询日志。
  4. 对于大多数的数据库而言,通常需要对应用程序进行非常大的改动,才能利用上横向扩容的新增资源。 与之相反的是,ElastiSearch天生就是分布式的 ,在ES集群中,我们可以随时增加、摘除节点,集群将会重新平均分布所有的数据。它知道如何通过管理多节点来提高扩容性和可用性。 这也意味着你的应用无需关注这个问题。

2.缺点

ES不支持事务、同时更适合查多改少的场景,所以我们在选择技术栈的时候需要注意这些限制。

3.ES基本概念

3.1 index(索引)

在ES中是最大的数据存储概念,它是由许多具有相同特征的文档组成的一个集合,相当于 MySQL 中的 Database

3.2 type(类型)

在 Index(索引)中,可以定义一个或多个类型; 类似于 MySQL 中的 Table;每一种类型的数据放在一起。(在7.0之后这一概念逐渐被取消,index取代type成为表的概念)

3.3 document(文档)

保存在某个索引(Index)下,某种类型(Type)的一个数据(Document),文档是 JSON 格式的, Document 就像是 MySQL 中的某个 Table 里面的内容。

3.4 field(字段)

字段是ES中最小的独立单元数据,每一个字段有自己的数据类型(可以自己定义覆盖ES自动设置的数据类型),我们还可以对单个字段设置是否分析、分词器等等。

ES常用的数据类型可分为四大类

  1. 核心数据类型
  • 字符串
1. text  ⽤于全⽂索引,搜索时会自动使用分词器进⾏分词再匹配
2. keyword 不分词,搜索时需要匹配完整的值
  • 数值型
1. 整型: byteshort,integer,long
2. 浮点型:floatdouble,half_float,scaled_float
  • 日期类型

es中的date可以由下面3种方式表示:

1. 格式化的date字符串,例如"2018-01-01"或者"2018-01-01 12:00:00"
2. 一个long型的数字,代表从1970110点到现在的毫秒数
3. 一个integer型的数字,代表从1970110点到现在的秒数

在es内部,date被转为UTC,并被存储为一个长整型数字,代表从1970年1月1号0点到现在的毫秒数。date类型字段上的查询会在内部被转为对long型值的范围查询,查询的结果类型是字符串。date格式可以在put mapping的时候用 format 参数指定,如果不指定的话,则启用默认格式,

  • 范围数据类型
integer_range, long_range, float_range,double_range,date_range
  • boolean(布尔)
  • binary (二进制)
  1. 复杂数据类型
1. object 单个json对象
2. array  支持不针对特定的数据类型
3. nested  嵌套类型
  1. 专用数据类型
1. IP 类型(IP) ip 用于描述 IPv4 和 IPv6 地址
2. Completion类型(补全) completion 提供自动完成提示
3. Token count类型(令牌计数) token_count 用来统计字符串中词条的数量
4. attachment类型(附件),支持将附件例如Microsoft Office格式,open document格式,ePub,HTML等索引为 attachment 数据类型。
5. Percolator类型(抽取) 接受来自领域特定语言(query-dsl)的查询
  1. 地理类型
1. Geo-point(地理坐标) geo_point 纬度/经度坐标
2. Geo-shape(地理圆形) geo_shape 用于多边形等复杂形状

3.5 mapping(映射)

定义文档和字段如何存储和索引,使用Mapping可以定义下面这些信息

  • 哪些字段应该作为全文索引
  • 哪些字段 包括numbers, dates, geolocations.
  • 时间类型的格式
  • 定义规则控制动态增加字段的mapping

3.6 shards(分片)

首先,每个分片都是一个Lucene索引实例,我们可以将其视作一个独立的搜索引擎,它能够对Elasticsearch集群中的数据子集进行索引并处理相关查询。分片分为两种:主分片(Primary Shard)、副本分片(Replica Shard)

  • 主分片:由于所有的数据都会在主分片中存储,所以主分片决定了文档存储数量的上限,但是一个索引的主分片数在创建时一旦指定,那么主分片的数量就不能改变,这是因为当索引一个文档时,它是通过其主键(默认)Hash到对应的主分片上(类似于RDBMS分库分表路由策略),所以我们一旦修改主分片数量,那么将无法定位到具体的主分片上。在mapping时我们可以设置number_of_shards值,最大值默认为1024。
  • 副本分片:我们可以为一个主分片根据实际的硬件资源指定任意数量的副本分片,上边已经说过,每个分片都可以处理查询,所以我们可以增加副本分片的资源(相应硬件资源提升)来提升系统的处理能力。同样,在mapping时,可以通过number_of_replicas参数来设置每个主分片的副本分片数量。

为了容错(节点主机宕机导致数据丢失),主分片和副本分片不能在同一个节点上,防止节点宕机导致部分数据丢失

3.6 cluster(集群)

在ES中,集群是由一个或多个ES节点组成的,每个集群都有一个唯一的名称/标识符,用作节点加入集群的依据。