当前位置: 首页 > 知识库问答 >
问题:

为什么我不能在Elasticsearch中混合我的数据类型?

阚乐湛
2023-03-14

目前,我正在尝试在这里实现汽车示例的变体:

https://www.elastic.co/blog/managing-relations-inside-elasticsearch

如果我运行:

PUT /vehicle/_doc/1
{  
   "metadata":[  
      {  
         "key":"make",
         "value":"Saturn"
      },
      {  
         "key":"year",
         "value":"2015"
      }
   ]
}

代码工作正常。

但是如果我删除索引并将2015从字符串更改为数字:

DELETE /vehicle
PUT /vehicle/_doc/1
{  
   "metadata":[  
      {  
         "key":"make",
         "value":"Saturn"
      },
      {  
         "key":"year",
         "value":2015
      }
   ]
}

我收到以下错误消息:

{“error”:{“root\u-cause”:[{“type”:“非法\u-argument\u-exception”,“reason”:“不同类型的映射器[元数据.值]、当前\u-type[长]、合并\u-type[文本]”}],“type”:“非法\u-argument\u-exception”,“reason”:“不同类型的映射器[元数据.值]、当前\u-type[长]、合并\u-type[文本]”}”,状态:400}

如何修复此错误?

共有1个答案

东方宜
2023-03-14
PUT /vehicle/_doc/1
{  
   "metadata":[  
      {  
         "key":"make",
         "value":"Saturn"
      },
      {  
         "key":"year",
         "value":2015
      }
   ]
}

删除索引,然后尝试如上所述为新文档编制索引后,将执行以下步骤:

  1. 当elastic无法找到名为“vehicle”(车辆)的索引并且启用了自动索引创建(默认情况下已启用)时,它将创建一个名为“vehicle”(车辆)的新索引
  2. 基于输入文档,elastic现在尝试对文档字段的数据类型进行最佳猜测。这就是所谓的动态场映射
  3. 对于上述文档,由于元数据是一个对象数组,因此假定字段元数据为对象数据类型
  4. 现在是决定单个对象字段的数据类型的步骤。当它遇到第一个对象时,它会找到两个字段:键和值。这两个字段都有字符串值(分别为make和Saturn),因此弹性将这两个字段的数据类型标识为text
  5. 然后尝试按以下方式定义映射:

      {
        "properties": {
          "metadata": {
            "properties": {
              "key": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              },
              "value": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              }
            }
          }
        }

当它遇到第二个对象时,其中值字段的值是数字(2015),它猜测数据类型为长。这会导致与先前识别的数据类型冲突,该数据类型是文本。字段不能为混合数据类型。数据类型很严格,因此会出现错误。

要解决此错误,需要确保每个对象的字段输入值的类型相同,如下所示:

PUT /vehicle/_doc/1
{  
   "metadata":[  
      {  
         "key":"make",
         "value":2016
      },
      {  
         "key":"year",
         "value":2015
      }
   ]
}

对于以上内容,它可以更好地用作:

PUT /vehicle/_doc/1
{  
   "metadata":[  
      {  
         "make":"Saturn",
         "year": 2015
      }
   ]
}
 类似资料:
  • 我正在做我的节目。我正在使用Sublime文本和用于编译基本Windows CMD。我有一个文件夹,在这个文件夹中我有一个包,里面有每个文件(folde todolist)。在这个包中,我有一个类(Gui.java(packgae(folder)Gui\u pckg))。此类中的代码如下所示: 导入javax。摆动导入java。awt。; 公共类Gui{ } 而且它编译得很好。 但是,当我试图编译

  • 当我试图在Django管理面板中查看我的产品时,出现以下错误。在我的产品模型中,我有“models.DecimalField”,我认为这很重要。Django错误描述 base.py第34行是一个函数: 更多信息:无效操作at/admin/products/products/ 产品/admin.py 来自django。contrib导入管理 从…起进口产品模型 管理地点登记册(产品)

  • 所以,实际上我对Java编程语言还是新手,并且还在学习如何转换数据类型,所以在这种情况下,我很难将字节转换为短字节。你们能帮帮我吗?? 所以在这种情况下,我可以正常地从(int)转换为(long)数据类型,因为(long)数据大小大于(int)。这与我尝试将其从(short)转换为(int)时的情况相同。但为什么我不能使用这个概念将数据类型从(byte)转换为(short)??即使(短)数据大小大

  • 问题内容: 如果html文件是本地文件(在我的C驱动器上),则可以使用,但是如果html文件在服务器上并且图像文件是本地文件,则无法使用。这是为什么? 任何可能的解决方法? 问题答案: 如果客户端可以请求本地文件系统文件,然后使用JavaScript找出其中的内容,则将是一个安全漏洞。 解决此问题的唯一方法是在浏览器中构建扩展。Firefox扩展和IE扩展可以访问本地资源。Chrome的限制更为严

  • 问题内容: 我正在建模黎曼θ函数: 它对否定无效; 例如导致此错误: 为什么?应该只是如果我正确地记得我的数学。 问题答案: 在NumPy中,用于选择类似操作的输出dtype的逻辑基于dtype,而不是值。这意味着必须具有与相同的输出dtype 。 给出整数输出之类的东西很重要,这意味着必须给出整数或什么都不给出。他们什么也没捡。将整数提高为负整数幂是NumPy中的错误。 如果要浮点输出,请进行浮

  • 我声明了一个自定义trait 的数组,以便在Rust中试验多态性,但是编译器似乎在第一个元素的子类型上进行类型推断: 编译器抱怨第一个元素是< code>Cat而不是其他元素: 向数组中添加类型也不能解决问题。因为这一次我得到了更多的错误: