es的字段都有一个字段类型,不同的类型都各有所长,比如keyword类型的字段适合做聚合和排序,而text的类型可以用来全文搜索。下面按大类介绍下es常用的数据类型,es的数据字段的类型定义和搜索的方式紧密相关,
例如 keyword类型,Number类型在搜索时,只适合精准匹配,范围搜索之类的,不能用于全文搜索。
而text类型适合全文搜索。
1.Common types
1.1 binary
二进制类型 ,值以base64字符串的形式存贮,_source默认不会存贮该类型的值,如果需要实际的存贮,请设置 store属性为true默认是false
type:binary
PUT my-index-000003
{
"mappings": {
"properties": {
"blob": {
"type": "binary",
"store": true
}
}
}
}
PUT my-index-000003/_doc/2
{
"blob": "U29tZSBiaW5hcnkgYmxvYg=="
}
1.1 boolean
布尔类型
type:boolean
true :true,“true"都可以表示 true
false: false,“false”,”" 都可以表示 false
PUT my-index-000003
{
"mappings": {
"properties": {
"boolean_field": {
"type": "boolean"
}
}
}
}
PUT my-index-000003/_doc/2
{
"boolean_field": "false"
}
1.2 Keywords
keywords大家庭包括 keyword,constant_keyword,widecard
keyword类型的字段适合聚合(aggragate)和排序(sort)操作,term和term_level查询比较快,如果字段的值都是数字,但term查询比较多,可以考虑定义keyword类型,而不是interger或者其他数字类型,
constant_keyword:所有文档的该字段的值都是一样的,可以定义该类型
widecard:适合通配符搜索日志等场景 ,text类型不支持通配符搜索,但widecard 在聚合和排序的性能会低于其他keyword类型,而且如果前导词是通配符,搜索效率相对会比较慢。
PUT my-index-000003/_mapping
{
"properties": {
"my_keyword":{
"type": "keyword"
},
"my_constant_keyword":{
"type": "constant_keyword",
"value":"constant"
},
"my_wildcard": {
"type": "wildcard"
}
}
}
PUT my-index-000003/_doc/1
{
"my_keyword":"keyword",
"my_wildcard" : "This string can be quite lengthy"
}
GET my-index-000003/_search
{
"query": {
"wildcard": {
"my_wildcard": {
"value": "*quite*"
}
}
}
}
1.3 Numbers
数字类型:包括整数和浮点数类型,有 short,interger,long unsigned_long,
float,double,half_float,scaled_float(底层是以long类型存贮的,需要配置scaled_factor ,浮点数*scaled_factor,比如价格一般是2位小数 ,如果scaled_factor配置为100 ,某个文档的该类型字段的值为 98.99,那么底层存贮 9899,相对于直接存double,节约了存贮空间),不是该字段存的是数字类型就一定要定义数字类型,数字类型在range查询,和一些数值计算查询相对会快,但是如果是term查询不如keyword类型。
PUT /my-index-000003/_mapping
{
"properties": {
"number_of_bytes": {
"type": "integer"
},
"time_in_seconds": {
"type": "float"
},
"price": {
"type": "scaled_float",
"scaling_factor": 100
}
}
}
1.4 Dates
日期类型包括 date和date_nanos.类型,
date类型可以通过format属性指定字段值的日期格式, || 连接多种格式
如果没有显示的指定format的属性值,默认为"strict_date_optional_time||epoch_millis"
"strict_date_optional_time"为常规的iso日期时间转换器,格式“yyyy-MM-dd ‘T’ HH:mm:ss.SSSZ” or “yyyy-MM-dd”,es默认内置了很多日期格式,大家可以翻阅文档查看
PUT my-index-000003/_mapping
{
"properties": {
"create_time":{
"type": "date",
"format":"yyyy-MM-dd HH:mm:ss"
}
}
}
POST my-index-000003/_doc
{
"create_time":"2021-05-15 23:14:55"
}
1.5 alias
为已存在的字段定义别名,别名可用于却大多数搜索api和field capabilities 。目前不是和写入api,比如添加或者更新等操作。
type : “alias”, path为当前目标字段的路径,如果该字段是有父类对象,
则path为 parentObject1.parentObject2.target_field
例如:
PUT /my-index-000003
{
"mappings": {
"properties": {
"user_name":{
"type": "text"
},
"name":{
"type": "alias",
"path" :"user_name"
},
"friends":{
"type": "nested",
"properties": {
"friends_name":{
"type":"text"
},
"f_name":{
"type": "alias",
"path":"friends.friends_name"
}
}
}
}
}
}
POST /my-index-000003/_doc/1
{
"user_name":"ly",
"frends":{
"friends_name":"luck"
}
}
GET /my-index-000003/_search?pretty
{
"query": {
"match": {
"name": "ly"
}
}
}
2.Objects and relational types(对象关系类型)
2.1 object
对象类型:字段值是一个json对象
POST customer/_doc/3
{
"name":"孙七",
"state":1,
"create_time":"2021-03-14 18:00:00",
"other":{
"age":27,
"address":"beijin",
"phone":"10010"
}
}
不显示指定字段类型,直接往里添加文档也是可以的,es默认会帮我们创建合适的类型,其他对象类型还有flattened,nested,join在object的基础上,提供了自己的一些特性,弥补了object的不足
3.Text search types(文本搜索类型)
text是全文搜索类型,在建立索引和搜索时,输入的文本会经过分析器处理(Analyzed),分析器会对其进行过滤,分词,转换等操作。es内置了多种分析器,而且我们可以定义分析器。
只有text类型才能用于match,match_phrase等搜索语句,
PUT /my-index-000003
{
"mappings": {
"properties": {
"user_name":{
"type": "text"
}
}
}
}
POST /my-index-000003/_doc
{
"user_name":"jack liu"
}
GET /my-index-000003/_search
{
"query": {
"match": {
"user_name": "jack"
}
}
}
4. Arrays 数组类型
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还有很多其他的数据类型,没有一一介绍,大家有兴趣的话,可以去查看官方文档
https://www.elastic.co/guide/en/elasticsearch/reference/7.10/array.html