除了使用,我认为您别无选择
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。



