elasticsearch 动态模板不适用于短、字节和;浮动,elasticsearch,logstash,elasticsearch,Logstash" /> elasticsearch 动态模板不适用于短、字节和;浮动,elasticsearch,logstash,elasticsearch,Logstash" />

elasticsearch 动态模板不适用于短、字节和;浮动

elasticsearch 动态模板不适用于短、字节和;浮动,elasticsearch,logstash,elasticsearch,Logstash,我试图创建一个模板,在我的模板中我试图实现动态映射 以下是我写的内容,如在6.2.1中所述,自动检测到的唯一布尔值、日期、双精度、长、对象、字符串,在映射浮点、短和字节时遇到问题 在这里,如果我索引127,它将从short\u字段映射到short,这很好,但是当我索引一些325566时,我得到的异常数值(325566)超出了Java short的范围,我想抑制它,让long\u字段,应该注意这一点&它应该映射到long。我尝试过使用强制:false,忽略\u格式错误:true,但没有一个按预期工

我试图创建一个模板,在我的模板中我试图实现动态映射

以下是我写的内容,如在6.2.1中所述,自动检测到的唯一布尔值、日期、双精度、长、对象、字符串,在映射浮点、短和字节时遇到问题

在这里,如果我索引127,它将从short\u字段映射到short,这很好,但是当我索引一些325566时,我得到的异常数值(325566)超出了Java short的范围,我想抑制它,让long\u字段,应该注意这一点&它应该映射到long。我尝试过使用
强制: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为您猜测的类型
  • 并通过文档中的路径
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为您猜测的类型
  • 并通过文档中的路径
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。如果我们想要,我们必须定义严格的映射?根据我的要求,文件名不能添加任何后缀或前缀