2 万字详解,彻底讲透 Elasticsearch( 五 )


 
小结:

  • 将数据分片是为了提高可处理数据的容量和易于进行水平扩展,为分片做副本是为了提高集群的稳定性和提高并发量 。
  • 副本是乘法,越多消耗越大,但也越保险 。分片是除法,分片越多,单分片数据就越少也越分散 。
  • 副本越多,集群的可用性就越高,但是由于每个分片都相当于一个 Lucene 的索引文件,会占用一定的文件句柄、内存及 CPU 。并且分片间的数据同步也会占用一定的网络带宽,所以索引的分片数和副本数也不是越多越好 。
 
映射(MApping)映射是用于定义 ES 对索引中字段的存储类型、分词方式和是否存储等信息,就像数据库中的 Schema ,描述了文档可能具有的字段或属性、每个字段的数据类型 。
只不过关系型数据库建表时必须指定字段类型,而 ES 对于字段类型可以不指定然后动态对字段类型猜测,也可以在创建索引时具体指定字段的类型 。
对字段类型根据数据格式自动识别的映射称之为动态映射(Dynamic Mapping),我们创建索引时具体定义字段类型的映射称之为静态映射或显示映射(Explicit Mapping) 。
在讲解动态映射和静态映射的使用前,我们先来了解下 ES 中的数据有哪些字段类型?之后我们再讲解为什么我们创建索引时需要建立静态映射而不使用动态映射 。
ES(v6.8)中字段数据类型主要有以下几类:
2 万字详解,彻底讲透 Elasticsearch

文章插图
Text 用于索引全文值的字段,例如电子邮件正文或产品说明 。这些字段是被分词的,它们通过分词器传递 ,以在被索引之前将字符串转换为单个术语的列表 。
分析过程允许 Elasticsearch 搜索单个单词中每个完整的文本字段 。文本字段不用于排序,很少用于聚合 。
Keyword 用于索引结构化内容的字段,例如电子邮件地址,主机名,状态代码,邮政编码或标签 。它们通常用于过滤,排序,和聚合 。Keyword 字段只能按其确切值进行搜索 。
通过对字段类型的了解我们知道有些字段需要明确定义的,例如某个字段是 Text 类型还是 Keyword 类型差别是很大的,时间字段也许我们需要指定它的时间格式,还有一些字段我们需要指定特定的分词器等等 。
如果采用动态映射是不能精确做到这些的,自动识别常常会与我们期望的有些差异 。
所以创建索引的时候一个完整的格式应该是指定分片和副本数以及 Mapping 的定义,如下:
PUT my_index {"settings" : {"number_of_shards" : 5,"number_of_replicas" : 1}"mappings": {"_doc": {"properties": {"title": { "type": "text" },"name": { "type": "text" },"age": { "type": "integer" },"created": {"type": "date","format": "strict_date_optional_time||epoch_millis"}}}}} 
ES 的基本使用在决定使用 Elasticsearch 的时候首先要考虑的是版本问题,Elasticsearch (排除 0.x 和 1.x)目前有如下常用的稳定的主版本:2.x,5.x,6.x,7.x(current) 。
你可能会发现没有 3.x 和 4.x,ES 从 2.4.6 直接跳到了 5.0.0 。其实是为了 ELK(ElasticSearch,Logstash,Kibana)技术栈的版本统一,免的给用户带来混乱 。
在 Elasticsearch 是 2.x (2.x 的最后一版 2.4.6 的发布时间是 July 25, 2017) 的情况下,Kibana 已经是 4.x(Kibana 4.6.5 的发布时间是 July 25, 2017) 。
那么在 Kibana 的下一主版本肯定是 5.x 了,所以 Elasticsearch 直接将自己的主版本发布为 5.0.0 了 。
统一之后,我们选版本就不会犹豫困惑了,我们选定 Elasticsearch 的版本后再选择相同版本的 Kibana 就行了,不用担忧版本不兼容的问题 。
Elasticsearch 是使用 Java 构建,所以除了注意 ELK 技术的版本统一,我们在选择 Elasticsearch 的版本的时候还需要注意 JDK 的版本 。
因为每个大版本所依赖的 JDK 版本也不同,目前 7.2 版本已经可以支持 JDK11 。
 
安装使用
2 万字详解,彻底讲透 Elasticsearch

文章插图
①下载和解压 Elasticsearch,无需安装解压后即可用,解压后目录如上图: