ElasticSearch(五)ElasticSearch字段类型

174 阅读3分钟

这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战

1、核心类型

1. 字符串类型

  • string:过期的字符串类型(在ES5之前使用,ES5后被Text和keyword替代)
  • text:全文本。通常用于基于文本的相关性搜索。全文本字段可以分词。全文本字段不用于排序,很少用于聚合等操作。
  • keyword:这种类型适用于结构化的字段

区别:

keyword:存储数据时候,不会分词建立索引 text:存储数据时候,会自动分词,并生成索引。

2. 数字类型

类型取值范围
long-2^63 到 2^63-1
integer-2^31到 2^31-1
short-2^15到 2^15-1
byte-2^7 到 2^7-1
double64位双精度
float32位双精度
half_float16位双精度
scaled_float缩放类型的浮点类型

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

3. 日期类型

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

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

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

4. 布尔类型

5. 二进制类型

默认不存储,也不可搜索。

6. 范围类型

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

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

2、复合类型

1. 数组类型

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

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

2. 对象类型

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

PUT product/_doc/2
{
  "date":"2020-11-11T11:11:11Z",
  "ext_info":{
    "address":"China"
  }
}

3. 嵌套类型

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"
	}
}

优点

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

缺点

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

3、地理类型

4、特殊类型