单个查询以查找某些字段具有最大值的文档

时间:2014-05-19 09:02:32

标签: elasticsearch

我有一组具有唯一数字运行ID的文档,我想查找运行ID最高的文档。

我可以做两个查询。

首先,我可以找到最高的运行ID:

{
    "size": 0,
    "aggregations": {
      "latest_run_id": {
        "aggregations": {
          "latest_run_id": {
            "max": {"field": "run_id"}
          }
        }
      }
    }
}

其次,我可以找到带有运行ID的文档:

{
    "filter": {
        {"term": {"run_id": latest_run_id}}
    }
}

有没有办法可以用一个查询来完成这个?

4 个答案:

答案 0 :(得分:24)

你可以通过组合"排序"来实现这一目标。和"尺寸":

`{
  "filter" : {
    "match_all" : { }
  },
  "sort": [
    {
      "run_id": {
        "order": "desc"
      }
    }
  ],
  "size": 1
}`

这将返回最高run_id

的记录

答案 1 :(得分:1)

可以使用热门点击聚合

检索保留最大值的整个文档
{
    "size": 0,
    "aggs":{
        "doc_with_max_run_id": {
            "top_hits": {
                "sort": [
                    {
                        "latest_run_id": {
                            "order": "desc"
                        }
                    }
                ],
                "size": 1
            }
        }
    }
}

同样通过修改'size'聚合参数,可以检索n-top文档。

答案 2 :(得分:0)

您可以使用以下代码在Java中获得此结果

SearchResponse max_r = maxCTSRB.setQuery(QueryBuilders.matchAllQuery())
        .addAggregation(AggregationBuilders.max("latest_run_id").field("run_id"))
        .addSort(new FieldSortBuilder("run_id").order(SortOrder.DESC))
        setSize(1).execute().get();

聚合仅用于验证。您可以完全省略

答案 3 :(得分:0)

只需用C#翻译Adam Drewery上面所说的话。

var response = await elasticSearchContext.ElasticClient.SearchAsync<MyClass>(s =>
                s.Query(q => q.MatchAll()).Sort(d => d.Descending(p => p.run_id)).Size(1));