在上篇文章中我们搭建好了Elasticsearch
集群和Kibana
。在今天的文章中,我们介绍下Elasticsearch
中索引的基本操作,我们今天的内容需要依赖之前搭建的环境。
今天的内容主要包含如下几部分
-
核心概念
-
Elasticsearch
相关操作- 创建索引
- 查看索引信息
- 写入数据
- 删除索引
-
Java客户端使用
1 核心概念
在学习之前我们先了解下在Elasticsearch
中一些相关的概念。
1.1 cluster 集群
多个Elasticsearch
服务可以组成一个集群,我们在上篇文章中就搭建了一个由3个Elasticsearch
服务组成的集群。每个集群都有他自己的名字,这个名称可由elasticsearch.yml
中的cluster.name
指定,我们搭建的集群名称为es-cluster
1.2 Node 节点
单个Elasticsearch
服务称为一个节点,我们搭建的集群包含3个节点。我们搭建的集群3个节点运行在一台主机上,生产环境通常是一台服务器只部署一个节点。同样每个节点也有自己的名称,名称由elasticsearch.yml
中的node.name
指定。
1.3 Index 索引
索引是数据的集合,我们操作Elasticsearch
中的数据时必须指定对应的索引,可以看成是Mysql
中的表结构。
1.4 Document 文档
文档是Elasticsearch
中的最小数据单元,类似于Mysql
表中的一条数据。
1.5 Shard 分片
Elasticsearch
是一个分布式系统,索引会被拆分为若干份存储在不同的服务节点上,这些便称为分片。
1.6 Replica 副本
2 Elasticsearch
相关操作
Elasticsearch
对外提供了RESTFul API
,我们同Elasticsearch
交互只需调用相关的http接口即可。
我们这部分的示例均在Kinana
中的dev tools
中执行。
2.1 创建索引
创建命令:PUT {indexName}
我们可以使用上面的命令创建一个索引,也可以在创建索引时设置一些参数:
settings
索引的相关设置 可以在这个参数里面设置分片和副本数量alias
索引的别名,可以通过这个参数为索引指定别名,一个别名可以对应多个索引,同时一个索引也可以有多个别名mapping
索引的映射信息,类似于Mysql
中创建表指定的scheme
例如我们创建一个order-001
的索引,示例如下:
执行上面这个请求,我们就创建了一个order-001
的索引,索引信息如下:
- 索引名称:order-001
- 索引别名:order
- 分片数量:3
- 副本数量:2
- 字段:orderNo,userId,productId,status,createdTime
2.1.1 字段类型
在上面的示例中,我们会通过type
参数指定字段的类型,Elasticsearch
中提供了丰富的数据类型,我们在业务中需要选择适当的类型,主要的类型如下:
text
字符串类型keyword
字符串类型 这个类型的字段不会进行分词boolean
byte short integer long
数字类型,区别是存储的长度不同object
对象float double
浮点型date
日期类型 在es中插入数据非常的灵活,通常会再使用format限制存入数据的格式join
关联类型nested
嵌套alias
别名 该类型的字段不存储数据,仅仅是指向一个其他字段ip
ip地址range
范围copy_to
geo_point
geo_shape
2.1.2 mapping中的参数
在示例代码中我们使用了type
和format
两个参数,还有很多其他的参数,详细可以参考官方文档,我这里简单的列举几个:
ignore_above
该参数可以用来指定一个长度,当字符串超出这个长度后会被截断,我法进行查询与排序coerce
取值为true/false 默认为true 在默认情况下我们定义一个integer类型的字段,向里插入数据时可以插入数字100也可以插入字符串"100" 将该值设置为false后,插入不满足格式的数据时会报错dynamic
动态创建mapping 取值有true/false/strict/runtime 默认情况下,插入一条数据,如果数据中有字段在mapping中不存在会自动创建对应的mapping 设置为false会忽略掉新的字段 strict会报错 runtime会作为runtime字段index
指定是否可以被检索 默认为true 设置为false 检索时会报错 对text类型字段生效null_value
设定插入null时的默认值,支持使用这个默认值查询 该参数只对keyword类型生效doc_value
copy_to
指定该字段的数值复制到的目标字段fields
2.1.3 创建滚动索引
滚动索引也是一个重要的知识点,在日志系统中可以使用这种方式创建一个新的索引来存储数据。
如果我们将数据一直往一个索引里写,这样这个索引的大小会越来越大,在大量数据的情况下显然是不合理的。实际上我们可以用别名来操作索引,当满足一定条件后新建一个索引,将别名指向新建的索引,之后的数据就会写入到新的索引中,使用滚动索引便可满足这样的场景。
请求语法:POST {indexAliasName}/_rollover
示例如下:
上面的示例我们使用滚动索引创建了一个test-rollover-000002的索引,我们使用elasticsearch-head
插件(大家可以自行安装一下)可以看到test-rollover这个别名指向了新的索引,信息如下:
在示例代码中我们并没有传递参数,调用这个API时指定我们传递一些条件参数,只有满足了对应的条件时才会执行成功,示例如下:
2.1.4 使用模版创建索引
创建索引时每次都有些相同的内容需要设置,比较繁琐,有没有一种方式来简化这种操作呢?模版便可以帮助我们实现这个功能。
索引模版是一个索引的规则,设置完成后,之后我们创建的索引都会自动使用相对应的规则。
创建模版的语句:PUT _template/{templateName}
我们创建一个订单索引的模版如下:
然后创建一个order-002的索引,查看其信息如下:
2.2 查看索引信息
Elasticsearch
中提供了一些查询索引信息的API,我们想查看一个索引的结构时可以用到,同时我们在学习时也会经常调用这些API查看索引的信息。
- GET {indexName} 查看索引信息
- GET {indexName}/_mapping 查看索引mapping信息
- GET {indexName}/_settings 查看索引settings信息
- GET {indexName}/_alias 查看索引别名信息
2.3 操作别名
别名是ES中非常重要的一个内容,接下来我们看看如何给索引绑定和解绑别名。
- GET {indexName}/_alias 查看某个索引的别名
- PUT {indexName}/_alias/{aliasName} 给某个索引绑定某个别名
我们使用这个API为上面创建的order-001绑定个order01的别名,然后查看其别名信息,示例如下:
- DELETE {indexName}/_alias/{aliasName} 为某个索引解绑一个别名
在上面的示例中我们会看到order-001索引有两个别名,我们使用该API删除order别名,示例如下:
- POST /_aliases 批量操作别名
在上面的示例中我们都是操作单个别名,有时需要批量操作时使用上面的方式很麻烦,使用这个API我们批量操作别名,示例如下:
2.4 写入数据
现在我们已经学习了一些索引相关的操作API,接下来我们学习下写入文档的API,文档的检索相关的内容我们在下篇文章中详细介绍。
语法:POST {indexName}/_doc
我们向在上面创建的order-001索引中插入一条数据,示例如下:
上面的示例我们向对应的索引中添加了一条数据,响应结果会告诉我们是否操作成功,并且会告诉我们是新建还是更新,同时会告诉我们一个_id
,这个是数据的id,在ES中每个文档都会有一个id,在一个索引中这个值是唯一的,上面插入数据时我们没有指定文档id,Es会给我们生成一个,如果想要自己生成id,可以使用如下语法:
PUT {indexName}/_doc/{id},示例如下
在ES中添加数据是非常灵活的,在上面的示例中我们添加的数据都是创建索引时在mappings
中配置了的属性,默认情况下ES是允许我们添加mappings
中不存在的字段的,并且会为我们动态的添加到mappings
中,我们可以向里面添加一条包含payTime
的字段,然后调用上面介绍的查询索引信息的接口查看mapping
信息,如下:
从结果中我们可以看出payTime
字段已经被添加到索引信息中了,如果我们想让业务插入数据时严格满足索引定义时的结构的话,只需在创建索引的语句中增加dynamic:strict
参数即可,这样插入不满足索引结构的数据时ES会抛出异常,索引创建语句修改如下:
2.5 删除索引
语法:DELETE {indexName}
3 总结
今天的文章就这些内容了,在今天的文章中主要介绍了对索引的一些操作API,这些内容大家可以自行操作一下。
- ES中的核心概念
- 索引的创建 在这部分我们介绍了索引的创建方式,同时简单的列举了下字段的类型以及mappings中的部分参数,这些内容在官方文档都有详细的介绍,同时也都有相关的示例,大家可以根据官网的介绍执行下看看效果。
- 索引信息的查看
- 索引别名的操作
- 写入文档
本文中并没有介绍文档的检索相关API,这部分内容将在下篇文章中详细的介绍,同时在下篇文章中也会介绍下Java
客户端的使用。
欢迎大家关注我的公众号:【Bug搬运小能手】
\