Elasticsearch扫盲之五:ElasticSearch中mapping字段的数据类型详解

在ElasticSearch中,字段有以下类型,主要分为简单类型和复合类型

一、简单类型

1.字符串
  • text : 文本,将会被分词
  • keyword : 有固定格式的文本,不会被分词(当作一个整体)

注:text类型一般用于全文索引,它将会被拆成多个关键词,与文档ID形成倒排索引,因此,在定义为text时,如果需要索引它,有必要指定它的分词器,特定是对于中文的文本

  1. {
  2. "user_id":"1001",
  3. "nickname":"shixinke"
  4. }
  • 这里的nickname是没必要分词的,因为它就是一个整体,它的数据类型可设置为keyword
2.数字

与java中的数字类型基本一致

  • byte : Byte
  • short: 短整型
  • integer:整型
  • long : 长整型
  • float : 浮点型
  • half_float :取值范围为float一半的浮点型(16位的浮点型)
  • double : 双精度浮点型
  • scaled_float : 类似于float
3.日期型date

date类型,附加了一个format参数,可以取以下几个值:

  • epoch_millis :毫秒数型
  • epoch_second :秒数
  • date_optional_time 或 strict_date_optional_time:ISO标准时间
  • basic_date : 基本日期型,格式为: yyyyMMdd.
  • basic_date_time : 基本日期时间型,格式:yyyyMMdd’T’HHmmss.SSSZ.
  • basic_date_time_no_millis : 基本日期时间且不带毫秒数,其格式为: yyyyMMdd’T’HHmmssZ.
  • basic_ordinal_date : 日期类型,只有年,没有天,天数为一年的第X天,其格式为:yyyyDDD.
  • basic_ordinal_date_time : 日期时间类型,与basic_ordinal_date相比,多了时分秒,其格式为: yyyyDDD’T’HHmmss.SSSZ.
  • basic_ordinal_date_time_no_millis: 与basic_ordinal_date_time相比,没有毫秒数,其格式为: yyyyDDD’T’HHmmssZ.
    -basic_time:基本时间,格式为: HHmmss.SSSZ.
  • basic_time_no_millis:基本时间,不包含毫秒数,其格式为:HHmmssZ.
  • basic_t_time : 基本时间,格式为: ‘T’HHmmss.SSSZ.
  • basic_t_time_no_millis:不带毫秒数的基本时间,其格式为: ‘T’HHmmssZ.
  • basic_week_date 或strict_basic_week_date:
  • weekyear_week或strict_weekyear_week:包含年份,和当前周为一年的第多少周:其格式为:xxxx-‘W’ww.
  • weekyear_week_day或strict_weekyear_week_day:包括年、一年的多少周和当天为这个周的第几天,其格式为: xxxx-‘W’ww-e.
  • year or strict_year:年,只有年份,其格式为: yyyy.
  • year_month 或strict_year_month:年月,其格式为: yyyy-MM.
  • year_month_day 或strict_year_month_day:年月日,其格式为:yyyy-MM-dd

也可以自定义:

  1. PUT user
  2. {
  3. "mappings": {
  4. "_doc": {
  5. "properties": {
  6. "date": {
  7. "type": "date",
  8. "format": "yyyy-MM-dd HH:mm:ss"
  9. }
  10. }
  11. }
  12. }
  13. }
4.布尔型boolean
  1. PUT user
  2. {
  3. "mappings": {
  4. "_doc": {
  5. "properties": {
  6. "is_author": {
  7. "type": "boolean"
  8. }
  9. }
  10. }
  11. }
  12. }
5.二进制类型binary
6.范围类型

一般范围类型,除了type属性外,还要有gte和lte两个附加参数

(1)数字范围
  • integer_range
  • long_range
  • float_range
  • double_range
  1. PUT user
  2. {
  3. "mappings": {
  4. "_doc": {
  5. "properties": {
  6. "status": {
  7. "type": "integer_range",
  8. "gte": 0,
  9. "lte":6
  10. }
  11. }
  12. }
  13. }
  14. }
(2)日期范围
  • date_range

日期范围类型,可以附加一个format参数

  1. PUT user
  2. {
  3. "mappings": {
  4. "_doc": {
  5. "properties": {
  6. "create_time": {
  7. "type": "date_range",
  8. "format": "yyyy-MM-dd HH:mm:ss"
  9. "get":"2019-03-30 10:00:00",
  10. "lte":"2090-03-30 10:00:00"
  11. }
  12. }
  13. }
  14. }
  15. }

二、复合类型

1.数组array
  • 包含基础类型元素的数组
  1. ["java", "elasticsearch"]
  2. [2,3]
  • 多维数组
  1. [1, [2,3]]
  • 对象数组
  1. [{"name":"shixinke", "age":31}]
2.对象object
  1. {"name":"shixinke", "city":"杭州"}
3.嵌套对象nested

一般用于多个文档的合并

  1. {
  2. "user_id":1001,
  3. "nickname":"shixinke",
  4. "stats":{
  5. "created":20,
  6. "stars":100
  7. }
  8. }

将个人信息与个人统计信息汇总到一个文档,其结构定义如下:

  1. PUT user
  2. {
  3. "mappings":{
  4. "_doc":{
  5. "properties":{
  6. "user_id":{
  7. "type":"long"
  8. },
  9. "nickname":{
  10. "type":"text"
  11. },
  12. "stats":{
  13. "type":"nested",
  14. "properties":{
  15. "created":{
  16. "type":"integer"
  17. },
  18. "stars":{
  19. "type":"integer"
  20. }
  21. }
  22. }
  23. }
  24. }
  25. }
  26. }
4.其他特殊类型
  • ip : IP地址
  • completion : 自动填充的字段
  • join : 在同一索引的文档中创建父/子关系