1.自動映射
如果index在創建時,未手動定義schema,而是靠put進第一條數據時自動識別的, 那麼識別規則如下:
1.1 text/long/float的識別
- "title": "Elasticsearch In Action"->text
- "age": 20 -> long
- "rating": 50.40 -> float
1.2 date的識別
1.2.1 識別為常規date(ISO8601)
- "release_time1": "2025-10-21" -> date
-
"release_time2": "2025-10-21T09:30:49" -> date
"release_time" : { "type" : "date" }注意: 此時生成的mapping, 再後續只能插入"2025-10-21"和"2025-10-21T09:30:49"形式的日期;如果是"2025/10/21"/"2025/10/21 09:30:49"/1420070400002這種的, 插入會報錯!
1.2.2 識別為帶format的date
- "release_time3": "2025/10/21" -> date
-
"release_time4": "2025/10/21 09:30:49" -> date
"release_time" : { "type" : "date", "format" : "yyyy/MM/dd HH:mm:ss||yyyy/MM/dd||epoch_millis" }注意: 此時生成的mapping, 再後續只能插入"2025/10/21"/"2025/10/21 09:30:49"/1420070400002 形式的日期;如果是"2025-10-21"和"2025-10-21T09:30:49"這種的, 插入會報錯!
1420070400002這個是epoch_millis毫秒數, 第一次插入不能用它(會識別為long), 但是已經被識別為"yyyy/MM/dd HH:mm:ss||yyyy/MM/dd||epoch_millis"的話, 後續的插入數據, 可以識別為date類型!
2.手動設置
可以自定義format多個
2.1 聲明所有常用格式
PUT test004
{
"mappings": {
"properties": {
"release_time": {
"type": "date",
"format": "yyyy-MM-dd||yyyy-MM-dd'T'HH:mm:ss||yyyy-MM-dd HH:mm:ss||yyyy/MM/dd HH:mm:ss||yyyy/MM/dd||epoch_millis"
},
"age": {
"type": "byte"
}
}
}
}
2.2 插入數據:所有格式
PUT /test004/_doc/1
{
"title": "the title 1",
"release_time": "2025-10-21",
"age": "20"
}
PUT /test004/_doc/2
{
"title": "the title 2",
"release_time": "2025-10-21T09:45:32",
"age": "32"
}
PUT /test004/_doc/3
{
"title": "the title 3",
"release_time": "2025-10-21 09:44:02",
"age": 32
}
PUT /test004/_doc/4
{
"title": "the title 4",
"release_time": "2025/10/21 09:45:00",
"age": 22
}
PUT /test004/_doc/5
{
"title": "the title 5",
"release_time": "2025/10/21",
"age": 22
}
PUT /test004/_doc/6
{
"title": "the title 6",
"release_time": 1761011360613,
"age": 22
}
2.3 甚至包括字符串格式的epoch_millis
PUT /test004/_doc/7
{
"title": "the title 7",
"release_time": "1761011360613",
"age": 23
}
2.4 查詢過濾(沒問題)
GET test004/_search
{
"query": {
"range": {
"release_time": {
"gte": "2025-10-21 09:44:02"
}
}
}
}
就是這樣, 上面的例子在es7.17.29 es8.15.5實踐過, 都沒問題