数据类型编辑

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 中的一个核心概念是 analyzed 字段,它是一个用于有效索引的全文值。这些字段的类型为 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 自动从 raw选择 raw 多字段以进行精确匹配。