Elasticsearch基础使用介绍(数据类型,索引操作)
环境准备
- Elasticsearch 服务(单机或集群)
- Kibana 服务
如果对ES不了解或没有上述环境,可以看下我之前的博客。
Elasticsearch查看集群信息,设置ES密码,Kibana部署
进入 Kibana 开发工具
数据类型
官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.10/mapping-types.html
基础数据类型
keyword
keyword类型是不进行切分的字符串类型。
这里的“不进行切分”指的是:在索引时,对keyword类型的数据不进行切分,直接构建倒排索引;在搜索时,对该类型的查询字符串不进行切分后的部分匹配。
keyword类型数据一般用于对文档的过滤、排序和聚合在现实场景中。
keyword经常用于描述姓名、产品类型、用户ID、URL和状态码等。keyword类型数据一般用于比较字符串是否相等,不对数据进行部分匹配,因此一般查询这种类型的数据时使用term查询。
text
text类型是可进行切分的字符串类型。
这里的“可切分”指的是: 在索引时,可按照相应的切词算法对文本内容进行切分,然后构建倒排索引;
在搜索时,对该类型的查询字符串按照用户的切词算法进行切分,然后对切分后的部分匹配打分。一般查询这种类型的数据时使用match查询
数值类型
官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.10/number.html
ES支持的数值类型有long、integer、short、byte、double、float、half float.scaled float和unsigned long等。
为节约存储空间并提升搜索和索引的效率,在实际应用中,在满足需求的情况下应尽可能选择范围小的数据类型。
数值类型的数据也可用于对文档进行过滤、排序和聚合。
boolean
用来表示 true 和 false
日期类型(date)
在ES中,日期类型的名称为date。ES中存储的日期是标准的UTC格式。
UTC(Universal Time Coordinated)叫做世界统一时间,中国大陆和 UTC 的时差是+8,也就是 UTC+8
在elasticsearch中的date类型可以是下面的形式:
- 格式化好的字符串,比如"2015-01-01",“2015/01/01 12:10:30”
- 一个long类型整数,代表从纪元以来的毫秒数
- 一个integer类型整数,表示从纪元开始的秒数
实际上不管日期以何种格式写入,在 ES 内部都会先换成 UTC 时间并存储为 long 类型
注意:
- long和integer必须是非负数
- 使用带格式的日期表示1970年之前的日期
- 日期将始终对外呈现为字符串
可以自定义日期格式(format),多个日期格式 用 || 分割
PUT my-index-000001
{
"mappings": {
"properties": {
"date": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
}
}
}
}
如果不指定使用默认格式strict_date_optional_time||epoch_millis
其中strict _date_optional time的含义是严格的时间类型,支持
yyyy-MM-dd、
yyyyMMdd.yyyyMMddHHmmss、
yyyy-MM-ddTHH:mm:ss、
yyyy-MM-ddTHH:mm:ss.SSS
yyyyMM-ddTHH:mm:ss.SSSZ等格式
epoch milis的含义是从1970年1月1日0点到现在的毫秒
注意strict_date_optional_time
并不支持 yyyy-MM-dd HH:mm:ss
格式
如果需要,需要指定format
为 yyyy-MM-dd HH:mm:ss
复杂数据类型
数组类型
官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.10/array.html
ES数组没有定义方式,其使用方式是开箱即用的,即无须事先声明。
在写入时把数据用中括号 [] 括起来,由ES对该字段完成定义。
PUT my-index-000001/_doc/1
{
"message": "some arrays in this document...",
"tags": [ "elasticsearch", "wow" ],
"lists": [
{
"name": "prog_list",
"description": "programming list"
},
{
"name": "cool_list",
"description": "cool stuff list"
}
]
}
当然,如果事先已经定义了字段类型,在写数据时以数组形式写入,ES也会将该类型转为数组。
数组应该不算一个纯粹的数据类型,而是一种逻辑存储方式
数组中的所有值都必须是 相同的数据类型。
数组类型的字段适用于元素类型的搜索方式,也就是说,数组元素适用于什么搜索,数组字段就适用于什么搜索。
例如,数组元素类型是keyword,该类型可以适用于term搜索。
对象类型
官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.10/object.html
对象类型 也不用事先定义,在写入文档时 ES 会自动识别转化为对象类型。
在写入数据时 使用花括号 {} 括起来,ES将自动识别为 对象类型
PUT my-index-000001/_doc/1