Elasticsearch:将日期映射为文本?

时间:2018-02-25 11:46:11

标签: elasticsearch

我的json数据有" product_ref"可以将这些值作为示例的字段:

"product_ref": "N/A"
"product_ref": "90323"
"product_ref": "SN3005"
"product_ref": "2015-05-23"

将数据推送到索引时出现映射错误:

{"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"mapper [root.product_ref] of different type, current_type [date], merged_type [text]"}],"type":"illegal_argument_exception","reason":"mapper [root.product_ref] of different type, current_type [date], merged_type [text]"},"status":400}

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

这种情况正在发生,因为ElasticSearch假设您正在索引特定格式的日期,并且尝试索引与该值不匹配的值。即在索引日期之后,您索引错误的格式。

确保所有值都是日期,且没有一个是空的,可能会在摄取层中删除它们。

编辑:如果您不想丢失日期值,可以使用dynamic mapping

{
    "dynamic_templates": [
        {
            "integers": {
                "match_mapping_type": "date",
                "mapping": {
                    "type": "text"
                }
            }
        }
    ]
}

答案 1 :(得分:2)

有一种名为date detection的内容,默认情况下已启用。

  

如果启用了date_detection(默认),则会检查新字符串字段以查看其内容是否与dynamic_date_formats中指定的任何日期模式匹配。如果找到匹配项,则会添加具有相应格式的新日期字段。

您只需要通过修改映射来禁用它:

 PUT /products    

 {
  "mappings": {
     "doc": { 
        "date_detection": false, 
        "properties": { 
           "product_ref": { "type": "keyword"  }, 

         }
      }
   }
 }