ElasticSearch中四种字段类型的详解
  TEZNKK3IfmPf 2023年11月13日 18 0

字符串类型

  • ​string​​​:这是一个已经​​过期​​​ 的字符串类型。在​​es5​​​ 之前,是用这个来描述字符串类型的数据的,现在的话,它已经被​​text​​​ 和​​keyword​​ 替代了。
  • ​text​​​:如果一个字段是要被​​全文检索​​​ 的,比如说博客的内容、新闻内容、产品描述,那么可以使用 text。用了 text 之后,字段存储的内容会被分析,在生成倒排索引之前,字符串会被分词器分成一个个词项。text 类型的字段不用于​​排序​​​,很少用于​​聚合​​​。这种字符串也被称为​​analyzed ​​ 字段。
  • ​keyword​​​:这种类型适用于结构化的字段,例如标签、email 地址、手机号码等等,这种类型的字段可以用作​​过滤​​​、​​排序​​​、​​聚合​​​ 等。这种字符串也称之为​​not-analyzed​​ 字段。

数字类型

类型

取值范围

long

-2^63 到 2^63-1

integer

-2^31 到 2^31-1

short

-2^15 到 2^15-1

byte

-2^7 到 2^7-1

double

64 位的双精度 IEEE754 浮点类型

float

32 位的双精度 IEEE754 浮点类型

half_float

16 位的双精度 IEEE754 浮点类型

scaled_float

缩放类型的浮点类型

 

  • 在满足需求的情况下,优先使用​​范围小​​ 的字段。字段长度越短,索引和搜索的效率越高。
  • 浮点数,优先考虑使用​​scaled_float​​。

scaled_float 举例:

PUT product
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"price": {
"type": "scaled_float",
"scaling_factor": 100
}
}
}
}

ElasticSearch中四种字段类型的详解

日期类型

由于 ​​JSON​​ 中没有日期类型,所以 es 中的日期类型形式就比较多样:

 

  • 2020-11-11 或者 2020-11-11 11:11:11。
  • 一个从 1970.1.1 零点到现在的一个秒数或者毫秒数。

 

es 内部将时间转为 ​​UTC​​​,然后将时间按照 ​​millseconds-since-the-epoch​​ 的长整型来进行存储。

自定义日期类型:

PUT product
{
"mappings": {
"properties": {
"date": {
"type": "date"
}
}
}
}

ElasticSearch中四种字段类型的详解

这个能够解析出来的时间格式比较多,如下。

PUT product/_doc/1
{
"date": "2021-01-10"
}

ElasticSearch中四种字段类型的详解

PUT product/_doc/2
{
"date": "2021-01-10T11:11:11Z"
}

ElasticSearch中四种字段类型的详解

PUT product/_doc/3
{
"date": "1604672099958"
}

ElasticSearch中四种字段类型的详解

最终查看数据如下所示:

ElasticSearch中四种字段类型的详解

上面的三个文档中的日期都可以被解析,内部存储的是毫秒计时的长整型数。

布尔类型(boolean)

JSON 中的 “true”、“false”、true、false 都可以,都可以代表布尔类型。

二进制类型(binary)

二进制接收的是 ​​base64​​ 编码的字符串,默认不存储,也不可以进行搜索。

范围类型

  • integer_range
  • float_range
  • long_range
  • double_range
  • date_range
  • ip_range

定义的时候,指定范围类型即可:

PUT product
{
"mappings": {
"properties": {
"date": {
"type": "date"
},
"price": {
"type": "float_range"
}
}
}
}

插入文档的时候,需要指定范围的界限:

PUT product/_doc/1
{
"date": "2021-02-24",
"price": {
"gt": 9,
"lt": 19
}
}

指定范围的时,可以使用 ​​gt​​​、​​gte​​​、​​lt​​​、​​lte​​。

复合类型

数组类型

es 中没有专门的数组类型。默认情况下,任何字段都可以有一个或者多个值。需要注意的是,数组中的元素必须是同一种类型。

添加数组时,数组中的第一个元素决定了整个数组的类型。

对象类型(object)

由于 JSON 本身具有层级关系,所以文档包含内部对象。内部对象中,还可以再包含内部对象。

PUT product/_doc/2
{
"date": "2021-02-24",
"ext_info": {
"address": "China"
}
}

嵌套类型(nested)

nested 是 object 中的一个特例。

如果使用 object 类型,假如有如下一个文档:

{
"user":[
{
"first":"Zhang",
"last":"san"
},
{
"first":"Li",
"last":"si"
}
]
}

由于 Lucene 没有内部对象的概念,所以 es 会将对象层次扁平化,将一个对象转为字段名和值构成的简单列表。即上面的文档,最终存储形式如下:

{
"user.first":["Zhang","Li"],
"user.last":["san","si"]
}

扁平化之后,用户名之间的关系没了。这样会导致如果搜索 Zhang si 这个人,会搜索到。

此时可以 nested 类型来解决问题,nested 对象类型可以保持数组中每个对象的独立性。nested 类型将数组中的每一饿对象作为独立隐藏文档来索引,这样每一个嵌套对象都可以独立被索引。

{
{
"user.first":"Zhang",
"user.last":"san"
},{
"user.first":"Li",
"user.last":"si"
}
}

优点

文档存储在一起,读取性能高。

缺点

更新父或者子文档时需要更新更个文档。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月13日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2024年05月17日   33   0   0 字符串php
TEZNKK3IfmPf