[英]Elasticsearch script filter on object array
我有以下彈性搜索文檔:
{
"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
之間的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
如果該值不是您期望的值,則過濾后的查詢不太可能起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.