数据类型

编辑

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 类型族

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

不支持的类型

上面未提及的类型

不支持

OTHER

0

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

显然,并非 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 的核心概念是已分析字段,即为了有效索引而解释的全文值。这些字段的类型为 text,并且不用于排序或聚合,因为它们的实际值取决于所使用的 分析器,因此 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 自动选择来自 rawraw 多字段进行精确匹配。