【问题标题】:Dynamic Template not working for short, byte & float动态模板不适用于短、字节和浮点数
【发布时间】:2018-02-26 06:25:47
【问题描述】:

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

这是我写的,就像在 6.2.1 中一样,唯一的布尔、日期、双精度、长整数、对象、字符串会被自动检测到,面临映射浮点数、短字节和字节的问题。

这里如果我索引127,它会从short_fields映射到short,没关系,但是当我索引一些325566时,我收到异常数值 (325566) 超出 Java 短的范围,我想抑制它并让 long_fields,应该注意这一点,它应该映射到长。我试过coerce:falseignore_malformed: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 logstash


    【解决方案1】:

    很遗憾,无法让 Elasticsearch 为您选择最小的数据类型。有很多解决方法,但让我先解释一下为什么它不起作用。

    为什么它不起作用?

    Dynamic mapping templates 允许通过三种方式覆盖默认的动态类型匹配:

    • 通过匹配字段名称,
    • 通过匹配 Elasticsearch 为您猜到的类型,
    • 以及文档中的路径。

    Elasticsearch 选择第一个有效的匹配规则。在您的情况下,第一条规则 short_fields 始终适用于任何整数,因为它接受任何字段名称和猜测的类型 long

    这就是为什么它适用于 127 但不适用于 325566。

    为了更好地说明这一点,让我们将第一条规则中的"matching_mapping_type" 改成这样:

    "match_mapping_type": "short",
    

    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

    推迟“收缩”数据,直到它开始成为性能问题。

    事实上,使用较小的数据类型将only affect searching/indexing performance,而不是所需的存储空间。只要您对动态映射感到满意,Elasticsearch 就会很好地为您管理它们。

    使用类型信息标记字段名称

    由于 Elasticsearch 无法从 long 中分辨出一个字节,因此您可以预先确定类型并在字段名称中添加类型信息,例如 customerAge_byterevenue_long

    然后你就可以像这样使用前缀/后缀match

        {
          "bytes_as_longs": {
            "match_mapping_type": "long",
            "match":   "*_byte",
            "mapping": {
              "type": "byte"
            }
          }
        }
    

    请选择更适合您需求的方法。

    为什么 Elasticsearch 需要很长时间

    Elasticsearch 对任何整数输入都采用 long 的原因可能来自数字类型的 JSON 定义(如 json.org 所示):

    无法判断数字01 在整个数据集中实际上是整数还是长整数。 Elasticsearch 必须从所示的第一个示例中猜出正确的类型,并尽可能采取最安全的方式。


    希望有帮助!

    【讨论】:

    • 非常感谢!!!!!!!!!!!! @nikolay,所以在最新版本中,我们不能使用字节、短和浮点。如果我们想要我们必须定义严格的映射?根据我的要求,由于某些限制,文件名不能加上任何后缀或前缀,所以最好有严格的映射?
    • @prasadkp 是的,如果可以的话,预先定义映射是最好的解决方案。您也可以只设置部分映射严格,请查看documentation of dynamic vs. strict以获取更多详细信息。
    猜你喜欢
    • 2017-02-09
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多