除了使用,我认为您别无选择script
。像这样:
{
"query": {
"bool": {
"must": [
{
"nested": {
"path": "transactions",
"query": {
"bool": {
"must": [
{
"match": {
"transactions.side": "buyer"
}
},
{
"range": {
"transactions.date": {
"from": "2014-10-24",
"to": "2015-10-24"
}
}
}
]
}
}
}
},
{
"filtered": {
"filter": {
"script": {
"script": "if(_source.transactions.size<3) return false;fromDate=Date.parse('yyyy-MM-dd',fromDateParam);toDate=Date.parse('yyyy-MM-dd',toDateParam);count=0;for(d in _source.transactions){docsDate=Date.parse('yyyy-MM-dd',d.get('date'));if(docsDate>=fromDate && docsDate<=toDate){count++};if(count==3){return true;}};return false;",
"params": {
"fromDateParam":"2014-10-24",
"toDateParam":"2015-10-24"
}
}
}
}
}
]
}
}
}
range
对于没有日期匹配的那些文档,实际的过滤器是“优化”的。因此,此文档(范围内没有日期)将不会到达费用更高的script
过滤器。
在script
本身首先检查是否交易的数量少于3
。如果是这样,请不要打扰所有日期检查并返回false
。如果超过,3
则取每个日期并与参数进行比较。一旦3
达到计数,请停止查看其余日期并返回true
。