【问题标题】:Query or Filter for minimum field value?查询或过滤最小字段值?
【发布时间】:2014-12-12 05:38:23
【问题描述】:

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

{ "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" }

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

{ "test": 2, "user":2, "score":65, "meta":"other data" },
{ "test": 4, "user":1, "score":23, "meta":"other data" }

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

POST user/tests/_search
{
  "aggs" : {
    "users" : {
      "terms" : {
          "field" : "user",
          "order" : { "lowest_score" : "asc" }
      },
      "aggs" : {
        "lowest_score" : { "min" : { "field" : "score" } }
      }
    }
  },"size":0
}

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

POST user/tests/_search
{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {"term": { "user": {"value": "1" }}},
            {"term": { "score": {"value": "22" }}}
          ]
        }
      }
    }
  }
}

我想知道是否有一种方法可以返回一个响应,该响应对于每个应试者来说具有最低的测试分数并包含原始 _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"}}]
          }
        }
      }
    }
  }
}

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    也许您可以尝试使用热门点击聚合:

    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
    }
    

    【讨论】:

    • 完美。我错过了 top_hits 中的值!我发现这对找到最终修复很有用。我将用解决方案更新上面的帖子。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2023-01-04
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    • 2015-07-27
    • 1970-01-01
    • 2018-10-28
    • 2021-11-21
    相关资源
    最近更新 更多