名称彼此为子串的Elasticsearch键

时间:2019-07-03 13:08:49

标签: elasticsearch

我已经和Elasticsearch玩了大约一天了,所以我很新。我正在尝试POST /导入一个简单的文档:

{
    "compression" : "none",
    "compression.level" : "0"
}

我收到以下错误:

{
"error": {
"root_cause": [
  {
"type": "mapper_parsing_exception",
"reason": "object mapping for [compression] tried to parse field [compression] as object, but found a concrete value"
}
],
"type": "mapper_parsing_exception",
"reason": "object mapping for [compression] tried to parse field [compression] as object, but found a concrete value"
},
"status": 400
}

据我了解,Elasticsearch将首先看到"compression" : "none"并创建一个名为string类型的compression的密钥?然后,当看到"compression.level" : "0"时,会将其视为具有对象值.level" : "0"的键“压缩”?或者...我真的不知道。

如何使它按预期工作?还是为什么它不能按我预期的那样工作?

谢谢!

1 个答案:

答案 0 :(得分:4)

compression的类型为object,并且您试图传递一个string值,该值不能直接传递。并且下面的错误消息对其进行了正确解释。

  

[压缩]的对象映射尝试将字段[压缩]解析为   对象,但找到了具体值

一个对象类型可以有多个sub-fields,用.表示,您可以将单个值传递给那些子字段。因此,根据您的情况,您可以传递compression.level的值。

有关更多说明和示例,请参阅ES官方文档。 https://www.elastic.co/guide/en/elasticsearch/reference/current/object.html

好像您正在使用动态映射,在这种情况下,elasticsearch看到带有.的字段名称,那么如果存在一个具有相同名称但没有.的字段,那么它将自动将其转换为object类型,具体情况取决于您的情况。

如果您想要一个值none的键,让我知道您有什么要求,那么您应该创建一个像这样的文档:

{
    "compression.stategy" : "none", // notice its a another sub-field. 
    "compression.level" : "0"
}

然后您可以通过点击_mapping https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-get-mapping.html

来检查所有子字段

根据您的理解(如果您使用的是动态映射),这有点不同,ES首先会看到"compression" : "none",然后尝试将其映射到文本字段,但随后会看到另一个字段{{1 }},并且它在字段名称中使用compression.level,并且.已经存在,因此开始将compression视为对象类型。