3.2.1.1.核心数据类型
String 字符串型
字符串型包括两种可用的数据类型:text和keyword
区别详解:
text数据类型的字段会进行分词,能够全文索引,不能够用于排序(sort) 和聚合操作(aggregations)
keyword数据类型不分词,够用于过滤、排序(sort) 和聚合操作(aggregations)
有时,同时具有全文(
text
)和关键字(keyword
)版本是有帮助的:一个用于全文本搜索,另一个用于聚合和排序。这可以通过多字段实现。
举例:
字符串: xiao xia mi
text数据类型:会拆分成xiao,xia,mi 三个单词进行倒排索引
keyword数据类型:则会作为一个整体进行索引。
当进行搜索时候,term操作时(term对搜索的关键词不进行拆分,作为一个整体进行搜索),搜索“xiao xia mi“,则会作为整体进行搜索,只有keyword数据类型可以搜索的到,及时你搜索“”xiao“,仍然无法匹配,因为keyword数据类型把“xiao xia mi“作为一个整体进行索引。
如果说是精确匹配(exact value),则必须类型设置为keyword数据类型,搜索时使用term搜索,如如电子邮件地址(email addresses),主机名(hostnames),状态码(status codes),邮政编码(zip codes)和标签(tags)。
如果说是字段全文检索,则使用text数据类型,搜索时s会用match搜索(因为match搜索会进行分词,然后去搜索),如电子邮件内容,产品描述(product description);
注意这边有一个历史遗留问题 原来代表字符串型的只有一个string的数据类型,现在拆分成了两个text和keyword
所以即使你使用string 做为mapping,不指定index属性(是否分词),则默认是text类型
详细解析:
keyword数据类型:
以上等价于5.x如下写法, 原因:not_analyzed代表不分词,keyword数据类型代表不进行字段分词的数据类型
text数据类型
以上等价于5.x如下写法, 原因:默认为analyzed代表分词,text数据类型代表进行字段分词的数据类型
发散思维:如果以下写法进行写
指定类型为text,是一个分词的数据类型,然后指定index属性为不分词,结果会是怎么样
结果查看,仍然为text数据类型:
String数据类型
string
字段不支持在5.x中创建的索引,这是因为text
和keyword
字段。在5.x中创建的索引中创建字符串字段将导致Elasticsearch尝试将string
升级到相应的text
或keyword
字段。它将返回一个HTTP Warning
请求头,告诉您该string
已被弃用。此升级过程并不总是完美的,因为有一些string支持的组合功能,但不被text
和keyword支持
。因此,最好使用text
或keyword
。
从2.x导入的索引仅支持string
,而不支持text
或keyword
。为了简化从2.x Elasticsearch的迁移,将应用于从2.x导入的索引的text
和keyword
映射降级为string
。最终,低于5.x版本的长期索引需要及时重建,截止时间为升级到6.x之前,这种降级可以在您分配合理后时间平滑进行。
text数据类型
示例:
text数据类型字段的参数
从5.x向2.x导入的索引不支持
text类型
。需要将将text类型转
为string类型
,采用重建方式。
keyword数据类型
示例:
keyword数据类型字段的参数
从5.x向2.x导入的索引不支持
text类型
。需要将将text类型转
为string类型
,采用重建方式。
Numeric 数字型
下面的数字型所支持的数据类型:
下面是配置一个数字字段映射的一个例子
注意:double , float 和half_float数据类型的-0.0 和 +0.0是不同值。因此,做一个term查询-0.0将不匹配 +0.0,反之亦然。同样适用于范围(range)查询:如果上限是 -0.0.那么 +0.0就会不匹配,如果下界+0.0.那么 -0.0将不匹配
类型如何选择?
在满足需求的情况下,尽可能选择范围小的数据类型。比如,某个字段的取值最大值不会超过100,那么选择byte类型即可。迄今为止吉尼斯记录的人类的年龄的最大值为134岁,对于年龄字段,short足矣。字段的长度越短,索引和搜索的效率越高。 优先考虑使用带缩放因子的浮点类型。
Date 日期型
JSON没有date这种数据类型, 所以elasticsearch中的date可以是以下形式:
包含格式化日期的字符串,例如 “2015-01-01”或“2015/01/01 12:10:30”。
代表milliseconds-since-the-epoch的长整型数。
代表seconds-since-the-epoch的整型数。
在内部,日期将转换为UTC(如果指定了时区),并将其存储为表示milliseconds-since-the-epoch的长整型数。
日期格式可以自定义,但如果没有指定格式,则使用默认格式:
这意味着它将接受带有可选时间戳的日期,这些日期符合strict_date_optional_time或者milliseconds-since-the-epoch所支持的格式。
例如:
多日期格式
可以使用||分隔多个格式 作为分隔符。 将依次尝试每种格式,直到找到匹配的格式。 第一个格式将用于将从时间的毫秒转换为字符串。
date字段的参数
date字段接受以下参数:
Boolean 布尔型
布尔字段接受JSONtrue和false值,但也可以接受被解释为true或false的字符串和数字:
一定要规范只使用 true 和 false
5.1.0中弃用。
虽然Elasticsearch目前在索引时间内接受上述值。 不建议使用这些伪布尔值搜索布尔域。 请改用“true”或“false”。
在5.3.0中弃用
任何非false,“false”,true和“true”的值已被弃用。
例如:
Boolean字段的参数
boolean字段接受以下参数
Binary 二进制型
binary(二进制)类型接受二进制值作为Base64编码字符串。 该字段默认情况下不存储,不可搜索:
binary字段的参数
binary(二进制)字段接受一下参数
白话解析:
二进制字段是存储在索引中的二进制数据的Base64表示,可用来存储以二进制形式正常写入的数据,例如图像.基于此类型的字段在默认情况下制备存储,而不索引,因此只能提取,但无法对其执行搜索操作.
Range 范围型
支持以下范围类型:
以下是使用各种范围字段配置映射的示例,后跟跟踪多个范围类型的示例。
以下是date_range查询的一个例子,该日期字段名为“time_frame”。
上述查询产生的结果。
range字段的参数
range字段接受一下参数:
Last updated