es字段的数据类型

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


版权声明:本文为lucky_ly原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。