重新索引后,Elasticsearch不遵循_mapping

时间:2017-02-23 23:12:05

标签: elasticsearch

我有一个名为 last_post_date 的字段存储在elasticsearch中。

它显示为:

...
"last_post_date": "1485281760000",
...

映射为:

"last_post_date": {
    "type": "text",
    "fields": {
        "keyword": {
            "type": "keyword",
            "ignore_above": 256
        }
    }
},

现在我使用映射创建一个新索引:

...
"last_post_date": {
    "type": "date",
    "format": "epoch_millis",
    "index": true,
    "doc_values": true
},
...

通过以下方式完成重新索引: http://127.0.0.1:9200/_reindex

问题在于,即使重新索引后,字段的值也会以字符串而不是日期存储,而映射显示:

...
"last_post_date": {
    "type": "date",
    "store": true,
    "format": "epoch_millis"
},
...

知道为什么吗?

1 个答案:

答案 0 :(得分:1)

您在源代码中看到的内容,即"1485281760000"形式的字符串式时间戳不会更改,并且始终会反映您发送给Elasticsearch的完全相同的JSON。

但是,在编入索引时,字符串"1485281760000"将被解释为索引并将其编入长值1485281760000

如果要更改JSON源,而是使用较长的时间戳而不是字符串时间戳(如下所示)发送,则源将显示您的长时间戳。

...
"last_post_date": 1485281760000,
...

长话短说:

  • 您在_source中看到的内容正是您发送给ES的内容
  • 根据您创建的映射解释和索引源的每个字段,即字符串时间戳将被强制转换为long并解释为格式为epoch_millis的日期
  • 如果根据您的映射无法正确解释,索引,强制某些字段值,您将收到错误,并且文档根本​​不会被编入索引。