一,ES简介

1,定义

ES是elaticsearch简写, Elasticsearch是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。

Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。

2,特点和优势

(1)分布式实时文件存储,可将每一个字段存入索引,让其能被检索

(2)近乎实时分析的分布式搜索引擎

(3)分布式:索引分拆成多个分片,每个分片可有零个或多个副本。集群中的每个数据节点都可承载一个或多个分片,并且协调和处理各种操作;

(4)负载再平衡和路由在大多数情况下自动完成。

(5)可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据(官网是这么说的)。也可以运行在单台PC上(已测试)。

(6)支持插件机制,分词插件、同步插件、Hadoop插件、可视化插件等。

二,ES基本概念

1,节点

运行了单个实例的ES主机称为节点,它是集群的一个成员,可以存储数据、参与集群索引及搜索操作。节点通过为其配置的ES集群名称确定其所要加入的集群。

2,集群

ES可以作为一个独立的单个搜索服务器。不过,一般为了处理大型数据集,实现容错和高可用性,ES可以运行在许多互相合作的服务器上。这些服务器的集合称为集群。

3,分片

ES的“分片(shard)”机制可将一个索引内部的数据分布地存储于多个节点,它通过将一个索引切分为多个底层物理的Lucene索引完成索引数据的分割存储功能,这每一个物理的Lucene索引称为一个分片(shard)。

这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。降低单服务器的压力,构成分布式搜索,提高整体检索的效率(分片数的最优值与硬件参数和数据量大小有关)。分片的数量只能在索引创建前指定,并且索引创建后不能更改。

4,副本

副本是一个分片的精确复制,每个分片可以有零个或多个副本。副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。

三,ES数据结构

1,索引(相当于数据库)

ES将数据存储于一个或多个索引中,索引是具有类似特性的文档的集合。类比传统的关系型数据库领域来说,索引相当于SQL中的一个数据库。一个ES集群中可以按需创建任意数目的索引,但根据不同的硬件配置,索引数有一个建议范围

2,类型(相当于数据库中的表)

类型是索引内部的逻辑分区(category/partition),然而其意义完全取决于用户需求。因此,一个索引内部可定义一个或多个类型(type)。一般来说,类型就是为那些拥有相同的域的文档做的预定义。类比传统的关系型数据库领域来说,类型相当于“表”

特别注意的是,根据官网信息:在Elasticsearch 6.0.0或更高版本中创建的索引只能包含一个映射类型。在5.x中创建的具有多种映射类型的索引将继续像在Elasticsearch 6.x中一样工作。类型将在Elasticsearch 7.0.0中的API中弃用,并在8.0.0中完全删除。

3,文档(相当于数据库中的行)

文档是Lucene索引和搜索的原子单位,它是包含了一个或多个域的容器,基于JSON格式进行表示。文档由一个或多个域(相当于数据库中的列)组成,每个域拥有一个名字及一个或多个值,有多个值的域通常称为“多值域”。每个文档可以存储不同的域集,但同一类型下的文档至应该有某种程度上的相似之处。相当于mysql表中的row

4,映射(相当于数据库中的模式)

映射是定义文档及其包含的字段如何存储和索引的过程。每个索引都有一个映射类型,它决定了文档的索引方式。

下图展示了ES与MySQL的对应

es按Date类型字段排序 es date类型排序_elasticsearch

四,ES数据类型

1,字符串类型

text 类型

当一个字段是要被全文搜索的,比如Email内容、产品描述,应该使用text类型。设置text类型以后,字段内容会被分析,在生成倒排索引以前,字符串会被分析器分成一个一个词项。text类型的字段不用于排序,很少用于聚合

keyword类型

keyword类型适用于索引结构化的字段,比如email地址、主机名、状态码和标签。如果字段需要进行过滤(比如查找已发布博客中status属性为published的文章)、排序、聚合。keyword类型的字段只能通过精确值搜索到

2,整数类型

byte:范围 -128~127
short:范围 -32768~32767
integer,short

3,浮点类型

double:64位双精度IEEE 754浮点类型
float:32位单精度IEEE 754浮点类型
half_float:16位半精度IEEE 754浮点类型
scaled_float:缩放类型的的浮点数

对于float、half_float和scaled_float,-0.0和+0.0是不同的值,使用term查询查找-0.0不会匹配+0.0,同样range查询中上边界是-0.0不会匹配+0.0,下边界是+0.0不会匹配-0.0。

其中scaled_float,比如价格只需要精确到分,price为57.34的字段缩放因子为100,存起来就是5734
优先考虑使用带缩放因子的scaled_float浮点类型。

4,date类型

日期类型表示格式可以是以下几种:

(1)日期格式的字符串,比如 “2018-01-13” 或 “2018-01-13 12:10:30”
 (2)long类型的毫秒数( milliseconds-since-the-epoch,epoch就是指UNIX诞生的UTC时间1970年1月1日0时0分0秒)
 (3)integer的秒数(seconds-since-the-epoch)

5,Boolean类型

true和false

6,Binary类型

进制字段是指用base64来表示索引中存储的二进制数据,可用来存储二进制形式的数据,例如图像。默认情况下,该类型的字段只存储不索引。二进制类型只支持index_name属性。

7,Array类型

1)字符数组: [ “one”, “two” ]
 (2)整数数组: productid:[ 1, 2 ]
 (3)对象(文档)数组: “user”:[ { “name”: “Mary”, “age”: 12 }, { “name”: “John”, “age”: 10 }],
 注意:lasticSearch不支持元素为多个数据类型:[ 10, “some string” ]

8,Object类型

JSON对象,文档会包含嵌套的对象

9,ip类型

用于存储IPv4或者IPv6的地址