【问题标题】:Why can't I mix my data types in Elasticsearch?为什么我不能在 Elasticsearch 中混合我的数据类型?
【发布时间】:2019-07-24 14:28:33
【问题描述】:

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

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
      }
   ]
}

我收到以下错误消息:

{ “错误”:{ “根本原因”: [ { "type": "illegal_argument_exception", “原因”:“不同类型的映射器 [metadata.value],current_type [long],merged_type [text]” } ], "type": "illegal_argument_exception", "reason": "mapper [metadata.value] 不同类型,current_type [long],merged_type [text]" }, "status": 400 }

如何解决这个错误?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:
    PUT /vehicle/_doc/1
    {  
       "metadata":[  
          {  
             "key":"make",
             "value":"Saturn"
          },
          {  
             "key":"year",
             "value":2015
          }
       ]
    }
    

    在删除索引然后尝试像上面那样为新文档建立索引后,会发生以下步骤:

    1. 当 elastic 找不到名为 vehicle 的索引并且启用了自动索引创建(默认情况下启用)时,它将创建一个名为 vehicle 的新索引。
    2. 现在弹性根据输入文档尝试对文档字段的数据类型做出最佳猜测。这被称为dynamic field mapping
    3. 对于上述文档,由于 metadata 是一个对象数组,因此字段 metadata 被假定为 object 数据类型。
    4. 现在是决定单个对象字段的数据类型的步骤。当它遇到第一个对象时,它会找到两个字段keyvalue。这两个字段都有字符串值(分别为makeSaturn),因此弹性将这两个字段的数据类型标识为text
    5. Elastic 然后尝试如下定义映射:
    
          {
            "properties": {
              "metadata": {
                "properties": {
                  "key": {
                    "type": "text",
                    "fields": {
                      "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                      }
                    }
                  },
                  "value": {
                    "type": "text",
                    "fields": {
                      "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                      }
                    }
                  }
                }
              }
            }
    

    当它遇到第二个对象,其中value 字段的值为数字(2015),它猜测数据类型为long。这会导致与先前标识的数据类型text 发生冲突。字段不能是混合数据类型。数据类型是严格的,因此会出错。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-03-06
      • 1970-01-01
      • 1970-01-01
      • 2019-12-18
      • 2020-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多