首页 > 解决方案 > 名称为彼此子字符串的 Elasticsearch 键

问题描述

我已经用 Elasticsearch 玩了大约一天了,所以我非常陌生。我正在尝试POST/import 一个简单的文档:

{
    "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"并创建一个名为compression字符串类型的键?然后,当它看到 时"compression.level" : "0",它会将其视为键“压缩”,对象值为.level" : "0"? 或者……我真的不知道。

我怎样才能让它按预期工作?或者为什么它不像我预期的那样工作?

谢谢!

标签: elasticsearch

解决方案


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

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

一个对象类型可以有多个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"
}

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

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


推荐阅读