本文参考了多篇入门和进阶文章,主要介绍了 ES 安装部署、ES 基本概念、映射和索引模板相关的内容。mysql
对于 Windows 系统,安装 Elasticsearch 最为简单,直接从官方网址下载 ES 的安装包(.zip),下载完成后解压到本地磁盘的某个文件夹;待解压完成后,进入安装根路径的 bin 目录,双击 elasticsearch.bat
便可开始使用。sql
安装使用 ES 前,请保证 Java 已经安装成功,确保已设置
JAVA_HOME
环境变量。数据库
Linux 单节点部署请参考下面的 Linux 集群部署。编程
集群部署能够参考文章:CentOS 7.4 下安装 ES 6.5.1 搜索集群数组
部份内容来源:Elasticsearch安装与配置bash
Elasticsearch 是一个接近实时(Near Real Time)的搜索平台,也就是说,从创建索引,到这个索引能够被搜索须要很小的延迟,一般是 1 秒。网络
一个集群就是由一个或多个节点组织在一块儿,这些节点共同持有所有的索引数据,并共同提供索引和搜索功能。一个集群由一个惟一的名字标识,这个名字很重要,一个节点只能经过指定某个集群的名字,来加入这个集群。app
一个节点就是集群中的一个服务,做为集群的一部分,它能够用来存储数据,参与集群的索引和搜索功能。对于许多应用场景来讲,部署一个单节点的 ElasticSearch 服务就足够了;可是考虑到容错性和数据过载,配置多节点的 ElasticSearch 集群是明智的选择。elasticsearch
一个索引就是一个拥有类似特征的文档(Document)的集合,ElasticSearch 把数据存放到一个或者多个索引中;一个索引由一个名字来标识,而且当咱们要对这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。分布式
许多人喜欢将index比喻为关系型数据库中的database,将type比喻为关系型数据库中的table,实际上这个比喻很是不贴切。由于在关系型数据库中,表中的字段都是独立的,可是在Elasticsearch中,在不一样的type中,若是filed具备相同的名字,则这些不一样的filed其实是由相同的Lucene Filed提供支持的,所以这种比喻并不恰当;另外一方面,在同一索引中存储具备不多或没有共同字段的不一样实体会干扰Lucene有效压缩文档的能力。
一个文档是可被索引的基础信息单元,文档以 JSON 格式来表示,在一个 index/type
里面,能够存储任意多的文档。文档由一个或者多个字段(Field)组成,每一个字段(Field)由一个字段名和一个或者多个值组成。
一个索引能够存储超出单个节点硬件限制的数据,例如一个具备 100 亿文档的索引占据 10TB 的磁盘空间,而任一节点可能没有这样大的磁盘空间来存储,或者单个节点处理搜索请求,响应会太慢。
为了解决这个问题,Elasticsearch 提供了将索引划分红多片的能力,这些片叫作分片。当用户建立一个索引的时候,能够指定分片的数量(默为 5,可是在 7.0 版本中默认会变为 1);每一个分片自己也是一个功能完善而且独立的“索引”,这个“索引”能够被放置到集群中的任何节点上。
分片之因此重要,主要有两方面的缘由:
至于一个分片怎样分布,它的文档怎样聚合回搜索请求,是彻底由 Elasticsearch 管理的,对于用户来讲,这些都是透明的。在一个网络/云的环境里,失败随时均可能发生。在某个分片/节点由于某些缘由处于离线状态或者消失的状况下,故障转移机制是很是有用且强烈推荐的。为此,Elasticsearch 容许建立分片的一份或多份拷贝,这些拷贝叫作复制分片,或者直接叫复制。
复制之因此重要,有两个主要缘由:
总之,每一个索引能够被分红多个分片,一个索引也能够被复制 0 次或屡次;分片和复制的数量能够在索引建立的时候指定,索引建立以后,能够在任什么时候候动态地改变复制的数量,可是不能再改变分片的数量。
部份内容来源:论 Elasticsearch 数据建模的重要性
映射(Mapping)是定义文档(Document)及其包含的字段(Field)的存储和索引方式的过程。
例如,使用映射来定义:
_all
字段中;like
的查询;long
:带符号的 64 位整数;integer
:带符号的 32 位整数;short
:带符号的 16 位整数;byte
:带符号的 8 位整数;double
:双精度 64 位 IEEE 754 浮点数;float
:单精度 32 位 IEEE 754 浮点数;half_float
:半精度 16 位 IEEE 754 浮点数;日期支持时间戳和字符串,具体根据日期字段 format
的设置;
epoch_millis
:时间戳(毫秒);strict_date_optional_time
:通用 ISO 日期时间解析器,其中日期是必需的,时间是可选的。"dtm_field": {
"mapping": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy/MM/dd HH:mm:ss||strict_date_optional_time||epoch_millis",
"store": "true"
}
}
复制代码
能够经过设置索引 mapping 的
dynamic_date_formats
参数来设置索引动态日期检测所匹配的日期格式。
false
:false,“false”,“off”,“no”,“0”,“”(空字符串),0,0.0
;true
:以上 false 示例的反面,一切非假值。二进制类型接受二进制值做为 Base64 编码字符串,该字段默认状况下不存储,不可搜索;可用于存储小图片,小文档等。
integer_range
:整型范围类型;float_range
:单精度浮点范围类型;long_range
:长整型范围类型;double_range
:双精度范围类型;date_range
:时间范围类型;ip_range
:IP 范围类型默认状况下,任何字段均可以包含零个或多个值,可是数组中的全部值必须是相同的数据类型。数组类型将单个数组元素作为一个数据单元,若是是分词的话也只是会依单个数组元素做为词源进行分词,不会将全部的数组元素整合到一块儿。在查询的时候若是数组里面的元素有一个可以命中那么将视为命中。
当使用 script 脚本时,使用
doc['xxxx'][0]
便可获取字段的值,等同于常规状况下的doc['xxxx'].value
。
文档可能包含内部对象,而内部对象又可能包含其余内部对象。
## 用户写入
{
"region": "US",
"manager": {
"age": 30,
"name": {
"first": "John",
"last": "Smith"
}
}
}
## 实际存储
{
"region": "US",
"manager.age": 30,
"manager.name.first": "John",
"manager.name.last": "Smith"
}
复制代码
nested 嵌套类型是 object 数据类型的特定版本,容许对象数组彼此独立地进行索引和查询。
## 用户写入
{
"group" : "fans",
"user" : [
{
"first" : "John",
"last" : "Smith"
},
{
"first" : "Alice",
"last" : "White"
}
]
}
## 实际存储
{
"group" : "fans",
"user.first" : [ "alice", "john" ],
"user.last" : [ "smith", "white" ]
}
复制代码
默认状况下,每一个索引最多建立 50 个嵌套文档,能够经过索引设置选项:
index.mapping.nested_fields.limit
修改默认的限制。
存储 IPV4 或 IPV6 地址。
geo_point
类型字段存储经纬度信息,能够用于:
请参考文章:Elasticsearch Suggester详解
请参考文章:基于 IK 分词器的 ES 通用索引模板
Any Code,Code Any!
扫码关注『AnyCode』,编程路上,一块儿前行。