我已经和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"
的键“压缩”?或者...我真的不知道。
如何使它按预期工作?还是为什么它不能按我预期的那样工作?
谢谢!
答案 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
视为对象类型。