elasticsearch 弹性/嵌套(C#)-获取索引中的最大ID

txu3uszq  于 2023-01-08  发布在  ElasticSearch
关注(0)|答案(2)|浏览(161)

我有一个实体存储在一个弹性索引,他的字段之一是一个Id(int)。
我目前正在使用此代码来检索数据:

var searchRequest = new SearchRequest<MyEntity>(indexName)
{
    Size = 1,
    Query = new MatchAllQuery(),
    Sort = new List<ISort>()
    {
        new FieldSort(){ Field = "_id", Order = SortOrder.Descending }
    }
};

var result = await _elasticClient.SearchAsync<MyEntity>(searchRequest);
var highestId = result.Documents.First().Id;

这段代码没有返回最大ID,但它返回了ID“999999”。我认为这是因为搜索请求中的“_id”不是我实体中的ID。查询该值的正确方法是什么?
编辑:我当然试过在上面的代码中使用“id”(或Id),但是我得到了一个例外
异常提示:应为:“true| false“,实际值:”“true”“,偏移量:639
此外,我尝试了这个,但我得到的id,它甚至低于前一个:

var response = await _elasticClient.SearchAsync<MyEntity>(s => s
                    .Index(indexName)
                    .Size(1)
                    .Aggregations(a => 
                        a.Max("max_id", x => x.Field("id"))
                    )
hsgswve4

hsgswve41#

如果使用id表示实体,请尝试以下操作:

GET my-index-000001/_search
{
  "size": 0,
  "aggs": {
    "max_id": {
      "max": {
        "field": "id"
      }
    }
  }
}
xlpyo6sf

xlpyo6sf2#

最后这里的解决方案:
@rabbitbr回复后,我收到了以下请求:

var response = await _elasticClient.SearchAsync<MyEntity>(s => s
                    .Index(indexName)
                    .Take(1)
                    .Aggregations(aggr =>
                        aggr.Max("get_max_id", max =>
                            max.Field(field => field.Id)
                            )
                    )
                );

var highestId = result.Documents.First().Id;

这里我的错误不是查询,而是我收集结果的方式:获取“highestId”值的正确方法是从响应中获取字段“聚合”,然后使用**.Max(聚合名称)**

var aggregationName = "get_max_id";
var response = await _elasticClient.SearchAsync<MyEntity>(s => s
                    .Index(indexName)
                    .Take(0)
                    .Aggregations(aggr =>
                        aggr.Max(aggregationName , max =>
                            max.Field(field => field.Id)
                            )
                    )
                );

var highestId = response.Aggregations.Max(aggregationName).Value;

相关问题