日期时间范围匹配的Elasticsearch聚合-部分匹配用例

时间:2019-05-16 05:18:31

标签: elasticsearch

我正在研究用例的弹性搜索,在其中我需要做等同于以下SQL查询的操作: 基本上计算与第一条和最后一条匹配记录部分匹配的航班的分钟差。

ORACLE查询将像这样:

CTE AS (从FA_PAIR_DUTY_FLT_LEG WHERE DEST_ARPT_CD ='ORD'和SCHED_LCL_DEP_DTM从'04 -MAY-19 18.20.00'和'08 -MAY-19 18.20.00'之间的MIN_LCL中选择MIN(SCHED_LCL_DEP_DTM)AS MIN_LCL) SELECT(24 * 60 *(MIN_LCL-to_date('2019-05-04 18.20.00','YYYY-MM-DD HH24:MI:SS'))),MIN_LCL FROM CTE;

Couchbase N1QL查询将像这样:

从CRF_DATA中选择DATE_DIFF_STR(test.minVal,'2019-05-16T09:25:00','minute')作为add_3_days,test.minVal从(选择min(LayoverStartDtm)作为minVal使用索引(gco_layover_pairingDutyFlightLeg_idx_1)其中docType ='PairingDutyFlightLeg'和DestAirportCd ='ORD',IsLayover ='Y',并且(LayoverStartDtm在'2019-05-16T09:25:00'和'2019-05-16T13:45:00')限制10)测试

请参阅以下样本文档。因此,如果我在查询中的日期范围是

(从-'2019-06-05T02:30:00'到'2019-06-05T19:00:00') 然后

如果我执行sum(fdpVal),则得到60 + 60 = 120,但这不是我想要的。

我想获得要减去的精确时间片,这不是匹配范围的一部分-

(2019-06-05T02:30:00-2019-06-05T02:00:00),这是30分钟。那 所以最后我想进行聚合30 + 60(fdpVal),这对我来说是90正确的值。 或者换句话说120-30 = 90。

{

“ GMTStart”:“ 2019-06-05T02:00:00”,

“ GMTEnd”:“ 2019-06-05T03:00:00”,

“ fdpVal”:60,

“ fileNo”:“ U127092”,

“ pairingId”:“ 21938432”

}

{

“ GMTStart”:“ 2019-06-05T03:01:00”,

“ GMTEnd”:“ 2019-06-05T04:00:00”,

“ fdpVal”:60,

“ fileNo”:“ U127092”,

“ pairingId”:“ 21938432”

}

您能帮我如何在Elasticsearch中实现这一点吗?

2 个答案:

答案 0 :(得分:0)

示例问题有点混乱,请重新格式化以方便阅读

我会给您一个示例代码段,希望您能有所想法

$from_date = "2019-06-05T02:00:00";
$to_date = "2019-06-05T03:00:00";

'aggs' => [
    //The "DATE_RANGE" string below is just an identifier of the Elasticsearch Aggs portion for your specific range requirement
    'DATE_RANGE' => [
        "range" => [
            "field" => "my_field",
            "ranges" => [
                [ "from" => $from_date,
                 "to"   => $to_date ],
            ],
            //the "format" below is required if you are specific with your dates' format
            'format' => "yy-MMM-dd'T'HH:mm:ss.SSS'Z'",
        ],
    ]
]

如有其他问题,请随时发表评论

答案 1 :(得分:0)

经过更多研究后,我找到了解决方法。基本上,我们需要使用脚本(无痛等)来实现,通过基本的过滤器查询可以获取子集数据。

如果需要更多详细信息,请与我联系。