我正在尝试创建一个模板,在我的模板中,我正在尝试实现动态映射。
这是我写的内容,如在 6.2.1 中,自动检测到唯一的布尔值,日期,双倍,长,对象,字符串,面临浮动,短和&映射的问题。字节。
如果我索引 127 ,它会从 short_fields 映射到短,没关系,但当我索引某些325566时,我得到的异常数字值(325566)超出Java short的范围,我想抑制它并让 long_fields ,应该注意这个&它应该映射到long。我尝试使用coerce:false
,ignore_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
}
}
}
]
答案 0 :(得分:2)
不幸的是,无法让Elasticsearch为您选择最小的数据类型。有很多变通方法,但我先解释一下为什么它不起作用。
Dynamic mapping templates允许以三种方式覆盖默认动态类型匹配:
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
以下是一些选项。
这使您可以完全控制类型的选择。
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为任何整数输入取长的原因可能来自数字类型的JSON定义(如json.org所示):
无法判断整个数据集中的数字1
或package 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必须从所示的第一个示例中猜出正确的类型,并且它可以采取最安全的镜头。
希望有所帮助!