查询或过滤最小字段值?

hub*_*rdr 3 elasticsearch

示例:存储在索引中的文档表示每个测试的测试分数和元数据。

{ "test": 1, "user":1, "score":100, "meta":"other data" },
{ "test": 2, "user":2, "score":65, "meta":"other data" },
{ "test": 3, "user":2, "score":88, "meta":"other data" },
{ "test": 4, "user":1, "score":23, "meta":"other data" }
Run Code Online (Sandbox Code Playgroud)

我需要能够过滤掉除最低测试分数之外的所有内容,并为每个应试者返回与该测试相关的元数据。所以我的预期结果集将是:

{ "test": 2, "user":2, "score":65, "meta":"other data" },
{ "test": 4, "user":1, "score":23, "meta":"other data" }
Run Code Online (Sandbox Code Playgroud)

我现在看到的唯一方法是首先通过用户使用嵌套的最小聚合进行术语聚合以获得他们的最低分数。

POST user/tests/_search
{
  "aggs" : {
    "users" : {
      "terms" : {
          "field" : "user",
          "order" : { "lowest_score" : "asc" }
      },
      "aggs" : {
        "lowest_score" : { "min" : { "field" : "score" } }
      }
    }
  },"size":0
}
Run Code Online (Sandbox Code Playgroud)

然后我必须获取该查询的结果并对每个用户进行过滤查询,并过滤最低分值以获取其余的元数据。哎呀。

POST user/tests/_search
{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {"term": { "user": {"value": "1" }}},
            {"term": { "score": {"value": "22" }}}
          ]
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我想知道是否有一种方法可以返回每个应试者的测试分数最低并包含原始 _source 文档的响应。

解决方案?

更新 - 已解决

下面给出了每个用户的最低分文档,并按总体最低分排序。并且,它包括原始文档。

GET user/tests/_search?search_type=count
{
  "aggs": {
    "users": {
      "terms": {
        "field": "user",
        "order" : { "lowest_score" : "asc" }
      },
      "aggs": {
        "lowest_score": { "min": { "field": "score" }},
        "lowest_score_top_hits": {
          "top_hits": {
            "size":1,
            "sort": [{"score": {"order": "asc"}}]
          }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

sve*_*tek 5

也许你可以用热门点击聚合来试试这个:

GET user/tests/_search?search_type=count
{
  "aggs": {
    "users": {
      "terms": {
        "field": "user",
        "order": {
          "_term": "asc"
        }
      },
      "aggs": {
        "lowest_score": {
          "min": {
            "field": "score"
          }
        },
        "agg_top": {
          "top_hits": {"size":1}
        }
      }
    }
  },
  "size": 20
}
Run Code Online (Sandbox Code Playgroud)