对象数组上的Elasticsearch脚本过滤器

时间:2015-04-21 08:14:53

标签: arrays elasticsearch

我有以下弹性搜索文档:

{
"json":{
  "freeSlots":[
         {
            "day":"2015-04-21",
            "beginTime":"08:00:00",
            "endTime":"09:00:00"
         },
         {
            "day":"2015-04-21",
            "beginTime":"14:00:00",
            "endTime":"17:00:00"
         }
      ]
   }
}

我预计这种查询会返回它:

{
"query" : {
    "filtered" : {
        "query" : {
            "match_all" : {}
        }
     },
     "filter" : {
         "script": {
             "script" : "doc['json.freeSlots.endTime'].value - doc['json.freeSlots.beginTime'].value > param1",
             "params" : {
                 "param1" : 7200000
             }
          }
     }
 }

不幸的是,它只考虑数组的第一个元素,它在endTimebeginTime之间的差异小于7200000毫秒。如何更改此查询以便它返回包含freeSlots数组内对象的任何文档,其持续时间(endTimebeginTime之间的差异)是否大于7200000毫秒?设置了日期映射。

1 个答案:

答案 0 :(得分:0)

我将每个广告位编入索引作为单独的文档: { "day":... "beginTime":... "endTime":... }

然后使用此查询:

{ "query": { "filter": { "script": { "params": { "delta": 7200000 }, "script": "(doc['endTime'].value - doc['beginTime'].value) > delta" } }, "filtered": { "query": { "match_all": {} } } } }

此外,您可能需要在服务器中配置脚本(AFAIK最新版本不支持此类动态脚本)。

一种调试方法是使用script_field输出一些值:

... "script_fields": { "delta": { "file": "debug_script_fields", "lang": "groovy" } } ...

在服务器中,在config/scripts中添加文件debug_script_fields.groovy

doc['endTime'].value - doc['beginTime'].value

如果该值不符合您的预期,则过滤后的查询不太可能有效。