我有以下弹性搜索文档:
{
"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毫秒。如何更改此查询以便它返回包含freeSlots
数组内对象的任何文档,其持续时间(endTime
和beginTime
之间的差异)是否大于7200000毫秒?设置了日期映射。
答案 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
如果该值不符合您的预期,则过滤后的查询不太可能有效。