我们正在使用PHP API执行类似的Elasticsearch查询:
$params = [
//please ignore the variables below,
//we made it in dynamic parameter-based in our function,
//that's why they're variables
'index' => $ourIndex,
'type' => $ourType,
'from' => $from,
'size' => $page_size,
'body' => [
"query" => [
'bool' => [
'must' => [
[
"query_string" => [
"default_field" => $content,
"query" => "$keywords"
]
],
[
"range" => [
"@timestamp" => [
"from" => $parseParams['pub_date_start'],
"to" => $parseParams['pub_date_end'],
'format' => "yy-MMM-dd'T'HH:mm:ss.SSS'Z'",
]
]
]
]
]
]
]
];
上面的查询与我们的@timestamp
字段一起使用,因为它的类型在date
"@timestamp" : {
"type" : "date"
}
一个样本值是这样的:
"@timestamp" : "2019-06-17T16:53:55.778Z"
但是,我们要在索引中定位pub_date
字段,并且在其映射中,该字段的类型为long
"pub_date" : {
"type" : "long"
},
因此在显示文档时它具有这种值:
"pub_date" : 1510358400
当我们将上面的查询从“ @timestamp
”改为“ pub_date
”而不是目标时,它现在显示如下错误:
尝试过的解决方案
我试图在epoch_millis
属性中添加其他格式format
:
[
"range" => [
"pub_date" => [
"from" => $parseParams['pub_date_start'],
"to" => $parseParams['pub_date_end'],
'format' => "yyyy-MM-dd||yy-MMM-dd'T'HH:mm:ss.SSS'Z'||epoch_millis",
]
]
]
但仍然失败
主要问题
我感到Elasticsearch的{{1}}查询无法识别Unix格式的值,这就是查询失败的原因。在不更改索引的 MAPPINGS 的情况下,是否可以解决此问题?
由于建议使用其他可能的解决方案来更改映射,但是索引中已经有大约2500万个文档,因此我们认为使用PHP对其进行格式化将是更好的方法
答案 0 :(得分:1)
由于该字段的类型为long
并存储了unix时间戳,因此只需使用strtotime将$parseParams['pub_date_start']
和$parseParams['pub_date_end']
中的日期转换为unix时间戳即可。如下更新范围查询:
"range" => [
"pub_date" => [
"from" => strtotime($parseParams['pub_date_start']),
"to" => strtotime($parseParams['pub_date_end']),
]
]