我有以下 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
}
}
}
}
不幸的是,它仅考虑数组的第一个元素,并且
endTime
和beginTime
之间的差小于7200000 ms。如何更改此查询,以便它返回freeSlots
数组中包含对象的任何文档,该文档的持续时间(endTime
和beginTime
之间的差)大于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
如果该值不是您期望的值,则过滤后的查询不太可能起作用。