(Elasticsearch)将Unix格式的数据转换为时间戳(无需更改映射)

时间:2019-06-21 03:09:46

标签: php laravel elasticsearch

我们正在使用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”而不是目标时,它现在显示如下错误:

Error 尝试过的解决方案
我试图在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对其进行格式化将是更好的方法

1 个答案:

答案 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']),
    ]
]