elasticsearch 通过单个查询查找某个字段具有最大值的文档

cnh2zyt3  于 2023-02-03  发布在  ElasticSearch
关注(0)|答案(4)|浏览(293)

我收集了一组具有唯一数字运行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}}
    }
}

有没有一种方法可以用一个查询来完成这个任务?

c86crjj0

c86crjj01#

您可以通过组合"sort""size"来完成此操作:

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

这将返回run_id值最大的记录

1wnzp6jl

1wnzp6jl2#

可以使用最高命中次数聚合来检索整个文档的最大值

{
    "size": 0,
    "aggs":{
        "doc_with_max_run_id": {
            "top_hits": {
                "sort": [
                    {
                        "latest_run_id": {
                            "order": "desc"
                        }
                    }
                ],
                "size": 1
            }
        }
    }
}

此外,通过修改“size”聚合参数,可以检索前n个文档。

owfi6suc

owfi6suc3#

您可以使用下面的代码在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();

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

hc2pp10m

hc2pp10m4#

只是用C#翻译一下亚当·德鲁里上面说的话。

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

相关问题