ElasticSearch 聚合查询 Select 每个组的前 1 项基于术语数组值

ElasticSearch Aggregation Query to Select Top 1 for each Group base on Terms Array values

我在下面写了使用过滤器和 Must 获取数据的 ES 查询: 我只能使用 ElasticSearch V5 来编写查询。

{
  "bool" : {
    "must" : [
      {
        "term" : {
          "Name" : {
            "value" : "Self",
            "boost" : 1.0
          }
        }
      }
    ],
    "filter" : [
      {
        "terms" : {
          "Number" : [
            "111",
            "222"
            
          ]
        }
      }
    ]
  }
}

我得到的输出是这样的重复值。我想使用聚合查询。

 "hits": [
      { "Name": "Self","Number": 111},
      { "Name": "Self","Number": 222},
      { "Name": "Self","Number": 222},
      { "Name": "Self","Number": 111}
    ]

我想 select 每个数字只有前 1 个值,所以我的结果会更少。
O/P 应该是:

"hits": [
          { "Name": "Self","Number": 222},
          { "Name": "Self","Number": 111}
        ]

您可以使用 field collapsing 删除重复的结果

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "Name": {
              "value": "Self",
              "boost": 1.0
            }
          }
        }
      ],
      "filter": [
        {
          "terms": {
            "Number": [
              "111",
              "222"
            ]
          }
        }
      ]
    }
  },
  "collapse": {
    "field": "Number"
  }
}

搜索结果将是

"hits": [
      {
        "_index": "68849562",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.10536051,
        "_source": {
          "Name": "Self",
          "Number": 111
        },
        "fields": {
          "Number": [
            111
          ]
        }
      },
      {
        "_index": "68849562",
        "_type": "_doc",
        "_id": "2",
        "_score": 0.10536051,
        "_source": {
          "Name": "Self",
          "Number": 222
        },
        "fields": {
          "Number": [
            222
          ]
        }
      }
    ]