正在加载

数据类型

Elastic Stack 无服务器

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 [预览] 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 中的实际映射(请参阅下面的 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

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 多字段以进行精确匹配。

© . All rights reserved.