温馨提示:本文翻译自stackoverflow.com,查看原文请点击:其他 - Elasticsearch keys with names that are substrings of one another

其他 - 名称彼此为子串的Elasticsearch键

发布于 2020-03-27 10:24:52

我已经和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"并创建一个名为compressionstring类型的键然后,它看到的时候"compression.level" : "0",它认为,作为关键的“压缩”与...的目标价值.level" : "0"或者...我真的不知道。

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

谢谢!

查看更多

查看更多

提问者
Addy
被浏览
36
Opster Elasticsearch Ninja 2019-07-03 21:28

compression是类型object,您正在尝试传递一个string不能直接传递的值。下面的错误消息正确解释了它。

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

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

请参考官方ES文档以获取更多说明和示例。https://www.elastic.co/guide/zh-CN/elasticsearch/reference/current/object.html

看起来您正在使用动态映射,在这种情况下,elasticsearch看到带有的字段名称.,然后,如果存在一个具有相同名称但没有的相应字段.,则它会自动将其转换为object类型,这是您遇到的情况。

让我知道您要的值键是什么要求none,那么您应该创建一个文档,例如:

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

您可以通过点击https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-get-mapping.html来检查所有子字段_mapping

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

发布
问题

分享
好友

手机
浏览

扫码手机浏览