赞
踩
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种数据类型,其中:
| 带符号的64位整数,其最小值为,最大值为。 |
| 带符号的32位整数,其最小值为,最大值为。 |
| 带符号的16位整数,其最小值为 |
| 带符号的8位整数,其最小值为 |
| 双精度64位IEEE 754浮点数,限制为有限值。 |
| 单精度32位IEEE 754浮点数,限制为有限值。 |
| 半精度16位IEEE 754浮点数,限制为有限值。 |
| 由a支持的有限浮点数 |
看着和java的数据类型占用字节数还是很像的。
我的项目中, es的数据是从mysql同步过去的,我将mysql常用的数据类型和es数据类型做了如下映射:
mysql <---> elasticsearch
smallint | integer |
bigint | long |
int(11) | integer |
decimal(12,2) | double |
varchar | text/keyword |
datetime(3) | date |
double(5,2) | double |
timestamp | date |
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(周日)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。