动态模板不适用于短,字节和浮动

时间:2018-02-26 06:25:48

标签: elasticsearch logstash

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

这是我写的内容,如在 6.2.1 中,自动检测到唯一的布尔值,日期,双倍,长,对象,字符串,面临浮动,短和&映射的问题。字节。

如果我索引 127 ,它会从 short_fields 映射到,没关系,但当我索引某些325566时,我得到的异常数字值(325566)超出Java short的范围,我想抑制它并让 long_fields ,应该注意这个&它应该映射到long。我尝试使用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
      }
    }
  }
]

1 个答案:

答案 0 :(得分:2)

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

为什么它不起作用?

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

  • 匹配字段名称,
  • 通过匹配Elasticsearch已经猜到的类型,
  • 并通过文档中的路径。

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

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

为了更好地说明这一点,让我们在第一个规则中更改"match_mapping_type": "short", ,如下所示:

  {
    "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选择正确的类型?

以下是一些选项。

手动定义严格映射

这使您可以完全控制类型的选择。

使用默认的customerAge_byte

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

实际上,使用较小的数据类型only affect searching/indexing performance,而不是所需的存储空间。只要你对动态映射很好,Elasticsearch就可以很好地管理它们。

使用类型信息

标记字段名称

由于Elasticsearch无法从long中告知字节,因此您可以事先确定类型,并在字段名称中添加类型信息,例如revenue_long { "bytes_as_longs": { "match_mapping_type": "long", "match": "*_byte", "mapping": { "type": "byte" } } }

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

0

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

为什么Elasticsearch需要多头

Elasticsearch为任何整数输入取长的原因可能来自数字类型的JSON定义(如json.org所示):

JSON number definition - from json.org

无法判断整个数据集中的数字1package main import ( "encoding/json" "fmt" ) func main() { data := []byte("{ \"a\" : { \"b\" : [ { \"n\" : 100, \"c\" : \"Apple\", \"m\" : 1, \"bool\" : false }, { \"n\" : 101, \"c\" : \"Berry\", \"m\" : 2, \"bool\" : false } ] }, \"foo\" : false, \"bar\" : \"foobar\" }") type c struct { N int `json:"n"` C string `json:"c"` M int `json:"m"` B bool `json:"bool"` } type b struct { C []c `json:"b"` Foo bool `json:"foo"` Bar string `json:"bar"` } type a struct { A b `json:"a"` } var result a if err := json.Unmarshal(data, &result); err != nil { panic(err.Error()) } fmt.Printf("%+v", result) } 实际上是整数还是长。 Elasticsearch必须从所示的第一个示例中猜出正确的类型,并且它可以采取最安全的镜头。

希望有所帮助!