我有这个字段映射
"time": {
"type": "date",
"format": "strict_date_optional_time||epoch_millis"
},
我正在使用此过滤器查询文档:
"range": {
"time": {
"gt": "1473157500000",
"lte": "1473158700000",
"format": "epoch_millis"
}
这可以工作并返回文档,但结果以不同的格式显示时间字段:
"time": "2016-09-06T10:25:23.678",
是否可以强制在epoch_millis中返回查询?
答案 0 :(得分:2)
_source
始终返回原始文档中的数据
理想情况下,我认为将_source
数据转换为所需的格式以便在客户端进行呈现或其他方式可能更加可取和灵活。
但是对于上述用例,您可以使用fielddata_fields
。
fielddata_fields将返回字段数据实际存储格式的字段,如果date
字段恰好是epoch_millis
。
来自文档:
允许返回每次匹配的字段的字段数据表示 字段数据字段可以在未存储的字段上工作。它的 重要的是要明白使用fielddata_fields参数会 导致该字段的术语被加载到内存(缓存),这 会导致更多的内存消耗。
示例:
post <index>/_search
{
"fielddata_fields": [
"time"
]
}
答案 1 :(得分:0)
从ES 6.5起,我们已在此特定结构中使用docvalue_fields
,因为fielddata_fields
已过时。例如。假设我们摄取了以下格式的json文档:
{
"@version": "1",
"@timestamp": "2019-01-29T10:01:19.217Z",
"host": "C02NTJRMG3QD",
"message": "hello world!"
}
现在让我们用docvalue_fields
执行以下get查询:
curl -X GET \
http://localhost:9200/myindex/_search \
-H 'Content-Type: application/json' \
-d '{
"query": {
"match_all": {}
},
"docvalue_fields": [
{
"field": "@timestamp",
"format": "epoch_millis"
}
]
}'
然后,我们将收到以下响应:
{
"took": 15,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 1,
"hits": [
{
"_index": "myindex",
"_type": "doc",
"_id": "mY8OmWgBF3ZItz5TVDiL",
"_score": 1,
"_source": {
"@version": "1",
"@timestamp": "2019-01-29T10:01:19.217Z",
"host": "C02NTJRMG3QD",
"message": "hello world!"
},
"fields": {
"@timestamp": [
"1548756079217"
]
}
}
]
}
}