【ElasticSearch】(八)浅析elasticsearch常用数据类型

1.where?

      介绍elasticsearch的数据类型之前,首先需要了解es映射的概念。

      es的存储结构是“index.type.document”形式,而映射就是定义一个document所包含的字段是如何存储、索引的。

      即对于elascticsearch数据类型,是在定义索引映射时定义的。

 

2.what?

      https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-fields.html

      如上所述,官网介绍了elasticsearch的数据类型,整理如下:

    (备注:设计索引前,建议先浏览下所有数据类型,需要用到哪种再深入研究,我对api文档的使用方法)

      可见,es的数据类型很多,对于常用的数据类型,我归类为:

1.text/keyword
2.Numeric
3.Date
4.Boolean
除此4类,官网将“binary”和“range”也视为core datatype,感兴趣的朋友可以研究下。

       简介:

       1)text/keyword都可理解存储string类型,在2.x版本种,es是存在string类型的,进化过程中演变为了text和keyword。

       2)Numeric,存储的则为数值型数据,其中包含long, integer, short, byte, double, float, half_float, scaled_float共8种数值类型,也是够丰富的,mysql种的数值型数据,都可以映射到Numeric当中。

       3)Date,时间类型,可以通过预设的3种形式或者自定义的format来存储日期信息。

       4)Boolean,这个就不用说啦。

 

3.how?

      1)text / keyword

      对字符串类型,在es 2.x版本,用string类型来表示,到了6.x,演化为“text”和“keyword”.其中:

      1.“text”类型

      场景:用于索引全文值字段,例如电子邮件正文或产品说明。这些字段是被分词的。分析过程允许Elasticsearch在每个全文字段中搜索单个单词。文本字段不用于排序,很少用于聚合

      用法:

PUT my_index
{
  “mappings”:{
    “_doc”:{
      “properties”:{
        “email_context”: {
          "analyzer": "ik_max_word", //指定分词器
          “type”:“text”
        }
      }
    }
  }
}

      2."keyword"类型

      场景:

      用于索引结构化内容的字段,例如电子邮件地址,主机名,状态代码,邮政编码或标签。

      它们通常用于过滤(找到我的所有博客文章,其中 status为published),排序,和聚合。关键字字段只能按其确切值进行搜索。

      用法:

PUT my_index
{
  “mappings”:{
    “_doc”:{
      “properties”:{
        “tags”:{
          “type”:“keyword”
        }
      }
    }
  }
}

      

      2)Numeric

      Numeric类型中支持8种数据类型,其中:

long

带符号的64位整数,其最小值为,最大值为。 -263263-1

integer

带符号的32位整数,其最小值为,最大值为。 -231231-1

short

带符号的16位整数,其最小值为-32,768,最大值为32,767

byte

带符号的8位整数,其最小值为-128,最大值为127

double

双精度64位IEEE 754浮点数,限制为有限值。

float

单精度32位IEEE 754浮点数,限制为有限值。

half_float

半精度16位IEEE 754浮点数,限制为有限值。

scaled_float

由a支持的有限浮点数long,由固定double比例因子缩放。

       看着和java的数据类型占用字节数还是很像的。

       我的项目中, es的数据是从mysql同步过去的,我将mysql常用的数据类型和es数据类型做了如下映射:

         mysql  <---> elasticsearch

smallintinteger
bigintlong
int(11)integer
decimal(12,2)double
varchartext/keyword
datetime(3)date
double(5,2)double
timestampdate
tinyint(2)integer

      实战中如何选择数据类型?

      1.整数型(byte,short,integer和long):你应该选择足以让你的用例最小的类型。这将有助于索引和搜索更有效。

      2.浮点型:使用缩放因子将浮点数据存储到整数中通常更有效,这是该scaled_float 类型所做的。(这里使用scaling_factor为100作为缩放因子,还是不太理解,大神可以帮忙解释下不?)

 

      3)Date型

      JSON没有日期数据类型,因此Elasticsearch中的日期可以是:

      1.包含格式化日期的字符串,例如"2015-01-01"或"2015/01/01 12:10:30"。
      2.一个代表毫秒以来的长数字。
      3.表示自纪元以来秒数的整数。
      在内部,日期转换为UTC(如果指定了时区)并存储为表示自纪元以来毫秒的长数。日期查询在内部转换为此长表示的范围查询,聚合和存储字段的结果将转换回字符串,具体取决于与字段关联的日期格式。

       在我的项目里,日期格式定义为:

PUT my_index {“
	mappings”: {“
		_ date”: {“
			properties”: {“
				date”: {“
					"format": "yyyy-MM-dd HH:mm:ss",
					"type": "date"
				}
			}
		}
	}
}

       即存入es种的时间格式,为“yyyy-MM-dd HH:mm:ss”。

       同时,可以通过“||”分隔来定义多种日期类型,如下:

PUT my_index {“
	mappings”: {“
		_ doc”: {“
			properties”: {“
				date”: {“
					type”:“ date”,“ format”:“ yyyy - MM - dd HH: mm: ss || yyyy - MM - dd || epoch_millis“
				}
			}
		}
	}
}

      备注:日期将始终呈现为字符串,即使它们最初在JSON文档中作为long提供。

 

       4)Boolean 型

      布尔字段接受JSON true和false值,也可以接受被解释为true或false的字符串,如下:

true, “true”, false, "false"

       使用如下:

映射索引:
PUT my_index {“
	mappings”: {“
		_ doc”: {“
			properties”: {“
				is_published”: {“
					type”:“ boolean”
				}
			}
		}
	}
}

获取字段:
POST my_index / _doc / 1 { “is_published” :“true”}
POST my_index / _doc / 1 { “is_published” :true}

 

     That's all. 19.01.27(周日)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值