elasticsearch 动态模板不适用于短、字节和;浮动
我试图创建一个模板,在我的模板中我试图实现动态映射 以下是我写的内容,如在6.2.1中所述,自动检测到的唯一布尔值、日期、双精度、长、对象、字符串,在映射浮点、短和字节时遇到问题 在这里,如果我索引127,它将从short\u字段映射到short,这很好,但是当我索引一些325566时,我得到的异常数值(325566)超出了Java short的范围,我想抑制它,让long\u字段,应该注意这一点&它应该映射到long。我尝试过使用elasticsearch 动态模板不适用于短、字节和;浮动,elasticsearch,logstash,elasticsearch,Logstash,我试图创建一个模板,在我的模板中我试图实现动态映射 以下是我写的内容,如在6.2.1中所述,自动检测到的唯一布尔值、日期、双精度、长、对象、字符串,在映射浮点、短和字节时遇到问题 在这里,如果我索引127,它将从short\u字段映射到short,这很好,但是当我索引一些325566时,我得到的异常数值(325566)超出了Java short的范围,我想抑制它,让long\u字段,应该注意这一点&它应该映射到long。我尝试过使用强制:false,忽略\u格式错误:true,但没有一个按预期工
强制:false
,忽略\u格式错误:true
,但没有一个按预期工作
"dynamic_templates": [
{
"short_fields": {
"match": "*",
"match_mapping_type": "long",
"mapping": {
"type": "short",
"doc_values": true
}
}
},
{
"long_fields": {
"match": "*",
"match_mapping_type": "long",
"mapping": {
"type": "long",
"doc_values": true
}
}
},
{
"byte_fields": {
"match": "*",
"match_mapping_type": "byte",
"mapping": {
"type": "byte",
"doc_values": true
}
}
}
]
不幸的是,无法让Elasticsearch为您选择尽可能最小的数据类型。有很多变通办法,但让我先解释一下为什么它不起作用 为什么它不起作用? 允许以三种方式覆盖默认动态类型匹配:
- 通过匹配字段的名称
- 通过匹配Elasticsearch为您猜测的类型
- 并通过文档中的路径
short\u fields
始终适用于任何整数,因为它接受任何字段名和猜测类型long
这就是为什么它适用于127,但不适用于325566
为了更好地说明这一点,让我们将第一条规则中的更改为“匹配映射类型”
,如下所示:
"match_mapping_type": "short",
{
"bytes_as_longs": {
"match_mapping_type": "long",
"match": "*_byte",
"mapping": {
"type": "byte"
}
}
}
Elasticsearch不接受它并返回错误:
{
"type": "mapper_parsing_exception",
"reason": "Failed to parse mapping [doc]: No field type matched on [short], \
possible values are [object, string, long, double, boolean, date, binary]"
}
但是我们怎样才能让Elasticsearch选择正确的类型呢?
以下是一些选项
手动定义严格映射
这使您可以完全控制类型的选择
使用默认的long
推迟“收缩”数据,直到它开始成为性能问题
事实上,使用较小的数据类型将不会增加所需的存储空间。只要您对动态映射很在行,Elasticsearch就可以很好地为您管理它们
用类型信息标记字段名
由于Elasticsearch无法区分字节和长字节,因此您可以事先确定类型,并在字段名中添加类型信息,如customerAge\u byte
或revenue\u long
然后您将能够使用如下前缀/后缀:
"match_mapping_type": "short",
{
"bytes_as_longs": {
"match_mapping_type": "long",
"match": "*_byte",
"mapping": {
"type": "byte"
}
}
}
请选择更适合您需要的方法
为什么Elasticsearch需要很长时间
Elasticsearch对任何整数输入都使用long的原因可能来自数字类型的JSON定义(如所示):
无法判断整个数据集中的数字0
或1
实际上是整数还是长。Elasticsearch必须从所示的第一个示例中猜出正确的类型,并尽可能采取最安全的方式
希望有帮助 不幸的是,无法让Elasticsearch为您选择尽可能最小的数据类型。有很多变通办法,但让我先解释一下为什么它不起作用 为什么它不起作用? 允许以三种方式覆盖默认动态类型匹配:
- 通过匹配字段的名称
- 通过匹配Elasticsearch为您猜测的类型
- 并通过文档中的路径
short\u fields
始终适用于任何整数,因为它接受任何字段名和猜测类型long
这就是为什么它适用于127,但不适用于325566
为了更好地说明这一点,让我们将第一条规则中的更改为“匹配映射类型”
,如下所示:
"match_mapping_type": "short",
{
"bytes_as_longs": {
"match_mapping_type": "long",
"match": "*_byte",
"mapping": {
"type": "byte"
}
}
}
Elasticsearch不接受它并返回错误:
{
"type": "mapper_parsing_exception",
"reason": "Failed to parse mapping [doc]: No field type matched on [short], \
possible values are [object, string, long, double, boolean, date, binary]"
}
但是我们怎样才能让Elasticsearch选择正确的类型呢?
以下是一些选项
手动定义严格映射
这使您可以完全控制类型的选择
使用默认的long
推迟“收缩”数据,直到它开始成为性能问题
事实上,使用较小的数据类型将不会增加所需的存储空间。只要您对动态映射很在行,Elasticsearch就可以很好地为您管理它们
用类型信息标记字段名
由于Elasticsearch无法区分字节和长字节,因此您可以事先确定类型,并在字段名中添加类型信息,如customerAge\u byte
或revenue\u long
然后您将能够使用如下前缀/后缀:
"match_mapping_type": "short",
{
"bytes_as_longs": {
"match_mapping_type": "long",
"match": "*_byte",
"mapping": {
"type": "byte"
}
}
}
请选择更适合您需要的方法
为什么Elasticsearch需要很长时间
Elasticsearch对任何整数输入都使用long的原因可能来自数字类型的JSON定义(如所示):
无法判断整个数据集中的数字0
或1
实际上是整数还是长。Elasticsearch必须从所示的第一个示例中猜出正确的类型,并尽可能采取最安全的方式
希望有帮助 非常感谢@nikolay,所以在最新版本中,我们不能使用byte、short和float。如果我们想要,我们必须定义严格的映射?根据我的要求,由于一些限制,文件名不能添加任何后缀或前缀,因此最好有严格的映射?@prasadkp是的,如果可以,事先定义映射是最好的解决方案。你也可以只做一部分地图,请查看更多细节。非常感谢@nikolay,所以在最新版本中,我们不能使用byte、short和float。如果我们想要,我们必须定义严格的映射?根据我的要求,文件名不能添加任何后缀或前缀