我有以下 flex 搜索文档:

{
"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 ms。如何更改此查询,以便它返回freeSlots数组中包含对象的任何文档,该文档的持续时间(endTimebeginTime之间的差)大于7200000 ms?日期映射已设置。

最佳答案

我将每个插槽都索引为一个单独的文档: { "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
如果该值不是您期望的值,则过滤后的查询不太可能起作用。

10-07 22:32