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