我的问题很简单。我有一个ES索引,其中包含updated
作为UNIX时间戳的字段。我的索引中只有测试记录(文档),这些记录都是今天创建的。
我有以下查询,它运行良好,并且(严格地)在执行时不返回任何结果:
GET /test_index/_search
{
"size": 1,
"query": {
"bool": {
"must": [
{
"range": {
"updated": {
"lt": "159525360"
}
}
}
]
}
},
"sort": [
{
"updated": {
"order": "desc",
"mode": "avg"
}
}
]
}
这样就可以了。但是,当我将查询中的时间戳更改为较小的数字时,会得到多个结果!这些结果在updated
字段中都包含比5000
!大得多的值!更令人困惑,我得到的结果与updated
在的范围仅是设置1971
到9999
。所以数字很喜欢1500
或10000
表现得很正常,我看不到任何结果。下面是行为奇怪的查询。
GET /test_index/_search
{
"size": 100,
"query": {
"bool": {
"must": [
{
"range": {
"updated": {
"lt": "5000"
}
}
}
]
}
},
"sort": [
{
"updated": {
"order": "desc",
"mode": "avg"
}
}
]
}
顺便说一句,这就是我存储在该索引中的典型文档的样子:
{
"_index" : "test_index",
"_type" : "_doc",
"_id" : "V6LDyHMBAUKhWZ7lxRtb",
"_score" : null,
"_source" : {
"councilId" : 111,
"chargerId" : "15",
"unitId" : "a",
"connectorId" : "2",
"status" : 10,
"latitude" : 77.7,
"longitude" : 77.7,
"lastStatusChange" : 1596718920,
"updated" : 1596720720,
"dataType" : "recorded"
},
"sort" : [
1596720720
]
}
这是该索引的映射:
PUT /test_index/_mapping
{
"properties": {
"chargerId": { "type": "text"},
"unitId": { "type": "text"},
"connectorId": { "type": "text"},
"councilId": { "type": "integer"},
"status": {"type": "integer"},
"longitude" : {"type": "double"},
"latitude" : {"type": "double"},
"lastStatusChange" : {"type": "date"},
"updated": {"type": "date"}
}
}
有什么解释吗?
ES中日期字段的默认格式为strict_date_optional_time||epoch_millis
。由于您未指定epoch_second
,因此您的日期被错误地解析(自时代以来被视为毫秒)。通过运行以下脚本可以验证:
GET test_index/_search
{
"script_fields": {
"updated_pretty": {
"script": {
"lang": "painless",
"source": """
LocalDateTime.ofInstant(
Instant.ofEpochMilli(doc['updated'].value.millis),
ZoneId.of('Europe/Vienna')
).format(DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm"))
"""
}
}
}
}
快速修复:如下更新映射:
{
...
"updated":{
"type":"date",
"format":"epoch_second"
}
}
并重新编制索引。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句