Elasticsearch(二): 索引的基本操作

106 阅读9分钟

在上篇文章中我们搭建好了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的索引,示例如下:

image-20220825190246783.png

执行上面这个请求,我们就创建了一个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中的参数

在示例代码中我们使用了typeformat两个参数,还有很多其他的参数,详细可以参考官方文档,我这里简单的列举几个:

  • 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

示例如下:

image-20220826123536916.png

上面的示例我们使用滚动索引创建了一个test-rollover-000002的索引,我们使用elasticsearch-head插件(大家可以自行安装一下)可以看到test-rollover这个别名指向了新的索引,信息如下:

image-20220826123848021.png

在示例代码中我们并没有传递参数,调用这个API时指定我们传递一些条件参数,只有满足了对应的条件时才会执行成功,示例如下:

image-20220826124256022.png

2.1.4 使用模版创建索引

创建索引时每次都有些相同的内容需要设置,比较繁琐,有没有一种方式来简化这种操作呢?模版便可以帮助我们实现这个功能。

索引模版是一个索引的规则,设置完成后,之后我们创建的索引都会自动使用相对应的规则。

创建模版的语句:PUT _template/{templateName}

我们创建一个订单索引的模版如下:

image-20220828172135706.png

然后创建一个order-002的索引,查看其信息如下:

image-20220828172353050.png

2.2 查看索引信息

Elasticsearch中提供了一些查询索引信息的API,我们想查看一个索引的结构时可以用到,同时我们在学习时也会经常调用这些API查看索引的信息。

  • GET {indexName} 查看索引信息
  • GET {indexName}/_mapping 查看索引mapping信息
  • GET {indexName}/_settings 查看索引settings信息
  • GET {indexName}/_alias 查看索引别名信息

image-20220825201330073.png

2.3 操作别名

别名是ES中非常重要的一个内容,接下来我们看看如何给索引绑定和解绑别名。

  • GET {indexName}/_alias 查看某个索引的别名

image-20220828142254139.png

  • PUT {indexName}/_alias/{aliasName} 给某个索引绑定某个别名

我们使用这个API为上面创建的order-001绑定个order01的别名,然后查看其别名信息,示例如下:

image-20220828142746480.png

  • DELETE {indexName}/_alias/{aliasName} 为某个索引解绑一个别名

在上面的示例中我们会看到order-001索引有两个别名,我们使用该API删除order别名,示例如下:

image-20220828143259761.png

  • POST /_aliases 批量操作别名

在上面的示例中我们都是操作单个别名,有时需要批量操作时使用上面的方式很麻烦,使用这个API我们批量操作别名,示例如下:

image-20220828144037267.png

2.4 写入数据

现在我们已经学习了一些索引相关的操作API,接下来我们学习下写入文档的API,文档的检索相关的内容我们在下篇文章中详细介绍。

语法:POST {indexName}/_doc

我们向在上面创建的order-001索引中插入一条数据,示例如下:

image-20220826155821550.png

上面的示例我们向对应的索引中添加了一条数据,响应结果会告诉我们是否操作成功,并且会告诉我们是新建还是更新,同时会告诉我们一个_id,这个是数据的id,在ES中每个文档都会有一个id,在一个索引中这个值是唯一的,上面插入数据时我们没有指定文档id,Es会给我们生成一个,如果想要自己生成id,可以使用如下语法:

PUT {indexName}/_doc/{id},示例如下

image-20220826160353194.png

在ES中添加数据是非常灵活的,在上面的示例中我们添加的数据都是创建索引时在mappings中配置了的属性,默认情况下ES是允许我们添加mappings中不存在的字段的,并且会为我们动态的添加到mappings中,我们可以向里面添加一条包含payTime的字段,然后调用上面介绍的查询索引信息的接口查看mapping信息,如下:

image-20220826160931373.png

从结果中我们可以看出payTime字段已经被添加到索引信息中了,如果我们想让业务插入数据时严格满足索引定义时的结构的话,只需在创建索引的语句中增加dynamic:strict参数即可,这样插入不满足索引结构的数据时ES会抛出异常,索引创建语句修改如下:

image-20220826161404567.png

2.5 删除索引

语法:DELETE {indexName}

3 总结

今天的文章就这些内容了,在今天的文章中主要介绍了对索引的一些操作API,这些内容大家可以自行操作一下。

  • ES中的核心概念
  • 索引的创建 在这部分我们介绍了索引的创建方式,同时简单的列举了下字段的类型以及mappings中的部分参数,这些内容在官方文档都有详细的介绍,同时也都有相关的示例,大家可以根据官网的介绍执行下看看效果。
  • 索引信息的查看
  • 索引别名的操作
  • 写入文档

本文中并没有介绍文档的检索相关API,这部分内容将在下篇文章中详细的介绍,同时在下篇文章中也会介绍下Java客户端的使用。

欢迎大家关注我的公众号:【Bug搬运小能手】

\