Elasticsearch排除了对字段值的最高命中

Ism*_*ail 9 elasticsearch

{'country': 'France', 'collected': '2018-03-12', 'active': true}
{'country': 'France', 'collected': '2018-03-13', 'active': true}
{'country': 'France', 'collected': '2018-03-14', 'active': false}
{'country': 'Canada', 'collected': '2018-02-01', 'active': false}
{'country': 'Canada', 'collected': '2018-02-02', 'active': true}
Run Code Online (Sandbox Code Playgroud)

假设我有这个结果集,我想按国家对它们进行分组.按国家对它们进行分组后,结果如下:

{'country': 'France', 'collected': '2018-03-14', 'active': false}
{'country': 'Canada', 'collected': '2018-02-02', 'active': true}
Run Code Online (Sandbox Code Playgroud)

但是,我要排除结果,其中最后一排activefalse(同一个国家的老行可以是真或假并不重要,只要最后一行等于true),我怎么能在elasticsearch做到这一点?这是我的查询:

POST /test/_search?search_type=count
{
    "aggs": {
        "group": {
            "terms": {
                "field": "country"
            },
            "aggs": {
                "group_docs": {
                    "top_hits": {
                        "size": 1,
                        "sort": [
                            {
                                "collected": {
                                    "order": "desc"
                                }
                            }
                        ]
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Tec*_*Sid 0

为什么不事先过滤它们:

POST /test/_search
{
  "query": {
    "bool": {
      "filter": [
        { 
          "term":{ 
            "active": true 
          }
        }
      ]
    }
  }, 
  "aggs": {
    "group": {
      "terms": {
        "field": "country"
      },
      "aggs": {
        "group_docs": {
            "top_hits": {
              "size": 2,
              "sort": [
                {
                  "collected": 
                  {"order":"desc"}
                }
              ]
            }
          }
        }
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

此查询将按 active 为 true 的县对您的数据进行分组。

更多信息:过滤上下文