背景
简介
Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。
从上图可以看到数据量、实时性、精确度只能满足两种,ES则是满足数据量和实时性,牺牲了部分精确度,主要体现在聚合的设计上,后续会具体分析
起源于Lucene
- 基于Java开发
- 创建于1999年,2005年成为Apache顶级开源项目
- Lucene具有高性能、易扩展的优点
- Lucene的局限性:
- 只能基于Java语言开发
- 类库的接口学习曲线陡峭
- 原生并不支持水平扩展
发展历程
2004:Shay Banon创造了Elasticsearch的前身,称为Compass。
2010:Shay Banon在2010年2月发布了Elasticsearch的第一个版本。
2012:Elasticsearch BV成立于2012年,主要围绕Elasticsearch及相关软件提供商业服务和产品。
使用情况
生态圈
客户端
ES的数据操作
创建索引
首先看下基本的创建索引语句
PUT /my_index
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
},
"mappings": {
"properties": {
"title": {
"type": "text"
},
"description": {
"type": "keyword"
},
"price": {
"type": "float"
}
}
}
}
其中:
settings: 索引级别的设置,包括分片数、副本数、分析器、过滤器等。
mappings: 字段映射,定义了索引中包含的字段及其数据类型、分析器等。
具体看下settings里面比较重要的几个参数
number_of_shards: 索引的分片数,决定了索引数据在集群中被分成多少个部分。每个分片都是一个独立的 Lucene 索引,可以在不同的节点上存储和处理。默认值为 5。该参数不能修改,修改时需要做数据迁移,因此设置要慎重,一般来说一个分片的规划容量不要超过50G
number_of_replicas: 索引的副本数,决定了每个分片有多少个副本。副本可以提高索引的可用性和容错性,当某个节点宕机时,可以从其它副本中恢复数据。默认值为 1。该参数可以修改
另外还有几个刷盘的参数,一般来说是使用默认(不重要的参数),如
refresh_interval: 刷新间隔,控制多久刷新一次内存中的索引数据到磁盘中,默认为1秒。
index.translog.sync_interval: 事务日志同步间隔,控制多久将内存中的事务日志写入磁盘中,默认为5秒。
index.translog.flush_threshold_ops: 内存中的事务日志达到多少条时触发写入磁盘操作,默认为5000条。
index.translog.flush_threshold_size: 内存中的事务日志达到多少大小时触发写入磁盘操作,默认为512MB。
index.translog.flush_threshold_period: 内存中的事务日志存储时间达到多久时触发写入磁盘操作,默认为30分钟。
从上面的各种参数可以看出,ES是在各种条件下才会将数据落盘,因此ES的数据写进去的时候不是立即能查到的
看完setting的参数,接下来简单看下mappings的参数(只解释最基本的操作,后续用到了再google查询即可)
"mappings": {
"properties": {
"title": {
"type": "text"
},
"description": {
"type": "keyword"
},
"price": {
"type": "float"
},
"date": {
"type":"date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd"
}
}
}
从上面看有title、description、price三个字段,三个字段的类型分别是text、keyword、float,下面是常用类型的表格
类型 | 说明 |
---|---|
text | 默认类型,不填则默认使用text,当一个字段需要用于全文搜索(会被分词), 比如产品名称、产品描述信息, 就应该使用text类型. |
keyword | 可理解为不需要分词的string,当一个字段需要按照精确值进行过滤、排序、聚合等操作时, 就应该使用keyword类型 |
byte | 有符号的8位整数, 范围: [-128 ~ 127] |
short | 有符号的16位整数, 范围: [-32768 ~ 32767] |
integer | 有符号的32位整数, 范围: [−231 ~ 231 -1] |
long | 有符号的64位整数, 范围: [−263~ 263 -1] |
float | 32位单精度浮点数 |
double | 64位双精度浮点数 |
date | 包含格式化日期的字符串, “2018-10-01”, 或"2018/10/01 12:10:30",代表时间毫秒数的长整型数字,代表时间秒数的整数 |
boolean | 布尔值 |
有些类型没列出来,等后续开发中用到了再去查询,现在全列出来也不一定能记住 |
添加文档
分为指定ID或不指定ID添加文档
指定ID添加文档
PUT /my_index/_doc/1
{
"title": "Elasticsearch",
"description": "Elasticsearch is a distributed, RESTful search and analytics engine",
"price": 100.0
}
不指定ID添加文档
POST /my_index/_doc
{
"title": "Elasticsearch",