数据类型

编辑

Elasticsearch 类型

Elasticsearch SQL 类型

SQL 类型

SQL 精度

核心类型

null

null

NULL

0

boolean

boolean

BOOLEAN

1

byte

byte

TINYINT

3

short

short

SMALLINT

5

integer

integer

INTEGER

10

long

long

BIGINT

19

unsigned_long

[预览] 此功能为技术预览版,可能会在未来的版本中更改或删除。Elastic 将努力解决任何问题,但技术预览版中的功能不受官方 GA 功能的支持 SLA 约束。 unsigned_long

BIGINT

20

double

double

DOUBLE

15

float

float

REAL

7

half_float

half_float

FLOAT

3

scaled_float

scaled_float

DOUBLE

15

关键字类型族

keyword

VARCHAR

32,766

text

text

VARCHAR

2,147,483,647

binary

binary

VARBINARY

2,147,483,647

date

datetime

TIMESTAMP

29

ip

ip

VARCHAR

39

version

version

VARCHAR

32,766

复杂类型

object

object

STRUCT

0

nested

nested

STRUCT

0

不支持的类型

上述未提及的类型

unsupported

OTHER

0

如上所示,大多数 Elasticsearch 数据类型在 Elasticsearch SQL 中可用。可以看出,除了 date 数据类型在 Elasticsearch SQL 中映射到 datetime 之外,所有 Elasticsearch 数据类型都映射到 Elasticsearch SQL 中具有相同名称的数据类型。这是为了避免与 ANSI SQL 类型 DATE(仅日期)和 TIME(仅时间)混淆,Elasticsearch SQL 在查询中也支持这些类型(使用 CAST/CONVERT),但它们并不对应于 Elasticsearch 中的实际映射(请参见下面的 table)。

显然,并非 Elasticsearch 中的所有类型在 SQL 中都有等效项,反之亦然,因此,Elasticsearch SQL 使用前者的数据类型特点而不是后者,因为最终 Elasticsearch 是后备存储。

除了上述类型之外,Elasticsearch SQL 还支持在运行时的 SQL 特定类型,这些类型在 Elasticsearch 中没有等效项。这些类型无法从 Elasticsearch 加载(因为它不知道这些类型),但可以在 Elasticsearch SQL 查询或其结果中使用。

下表指示了这些类型

SQL 类型

SQL 精度

date

29

time

18

interval_year

7

interval_month

7

interval_day

23

interval_hour

23

interval_minute

23

interval_second

23

interval_year_to_month

7

interval_day_to_hour

23

interval_day_to_minute

23

interval_day_to_second

23

interval_hour_to_minute

23

interval_hour_to_second

23

interval_minute_to_second

23

geo_point

52

geo_shape

2,147,483,647

shape

2,147,483,647

SQL 和多字段

编辑

Elasticsearch 的一个核心概念是 analyzed 字段,即为了有效索引而进行解释的全文值。这些字段的类型为 text,不用于排序或聚合,因为它们的实际值取决于使用的 analyzer,因此 Elasticsearch 还提供了 keyword 类型来存储精确值。

在大多数情况下,实际上是默认情况,是对字符串使用这两种类型,Elasticsearch 通过 多字段 支持这一点,即以多种方式索引同一字符串的能力;例如,将其索引为 text 以进行搜索,并索引为 keyword 以进行排序和聚合。

由于 SQL 需要精确值,因此当遇到 text 字段时,Elasticsearch SQL 将搜索它可以用于比较、排序和聚合的精确多字段。为此,它将搜索它可以找到的第一个规范化的 keyword,并将其用作原始字段的精确值。

考虑以下 string 映射

{
  "first_name": {
    "type": "text",
    "fields": {
      "raw": {
        "type": "keyword"
      }
    }
  }
}

以下 SQL 查询

SELECT first_name FROM index WHERE first_name = 'John'

与此相同

SELECT first_name FROM index WHERE first_name.raw = 'John'

因为 Elasticsearch SQL 自动从 raw拾取 raw 多字段以进行精确匹配。