ElasticSearch NEST - GroupBy then OrderBy

我需要将 linq 查询转换为 NEST。这就是我的 linq 查询的样子:

var result = studentList
            .GroupBy(student => student.Name)
            .Select(group => group.OrderByDescending(student => student.grade).Take(3))
            .SelectMany(p => p);

它应该:

  1. 按学生姓名分组

  2. 按年级对每个组进行个人排序,降序

  3. 从每个小组中选出成绩最好的前X名学生

它正在与linq一起工作,但是如何使用NEST做到这一点?我尝试聚合,子聚合,排序桶,但没有成功。

我知道如何按名称分组,但接下来呢?

client.Search<Students>(s => s
.Aggregations(a => a
    .Terms("group_by_name", ts => ts
        .Field(o => o.Name))));

如何对每个小组进行排序,如何从每个小组的顶尖学生中取出?


烙印99
浏览 149回答 1
1回答

侃侃尔雅

假设模型像public class Student&nbsp;{&nbsp; &nbsp; public int Id { get; set; }&nbsp; &nbsp; public string Name { get; set; }&nbsp; &nbsp; public int Grade { get; set; }}以下内容将按学生姓名分组,然后按年级降序排列每个组中的前 x 个匹配项private static void Main(){&nbsp; &nbsp; var defaultIndex = "students";&nbsp; &nbsp; var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));&nbsp; &nbsp; var settings = new ConnectionSettings(pool)&nbsp; &nbsp; &nbsp; &nbsp; .DefaultIndex(defaultIndex);&nbsp; &nbsp; var client = new ElasticClient(settings);&nbsp; &nbsp; if (client.IndexExists(defaultIndex).Exists)&nbsp; &nbsp; &nbsp; &nbsp; client.DeleteIndex(defaultIndex);&nbsp; &nbsp; var createIndexResponse = client.CreateIndex(defaultIndex, c => c&nbsp; &nbsp; &nbsp; &nbsp; .Settings(s => s&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .NumberOfShards(1)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .NumberOfReplicas(0)&nbsp; &nbsp; &nbsp; &nbsp; )&nbsp; &nbsp; &nbsp; &nbsp; .Mappings(m => m&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .Map<Student>(mm => mm&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .AutoMap()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; )&nbsp; &nbsp; &nbsp; &nbsp; )&nbsp; &nbsp; );&nbsp; &nbsp; var students = Enumerable.Range(1, 20).Select(i =>&nbsp; &nbsp; &nbsp; &nbsp; new Student&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Id = i,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Name = i % 2 == 0 ? "Foo" : "Bar",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Grade = i&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; );&nbsp; &nbsp; var bulkResponse = client.Bulk(b => b&nbsp; &nbsp; &nbsp; &nbsp; .IndexMany(students)&nbsp; &nbsp; &nbsp; &nbsp; .Refresh(Refresh.WaitFor) // refresh, so that documents indexed are available to search immediately&nbsp; &nbsp; );&nbsp; &nbsp; var topX = 10;&nbsp; &nbsp; var searchResponse = client.Search<Student>(s => s&nbsp; &nbsp; &nbsp; &nbsp; .Aggregations(a => a&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .Terms("student_name", t => t&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .Field(f => f.Name.Suffix("keyword"))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .Aggregations(aa => aa&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .TopHits("top_grades", th => th&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .Sort(so => so&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .Descending(f => f.Grade)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; )&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .Size(topX)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; )&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; )&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; )&nbsp; &nbsp; &nbsp; &nbsp; )&nbsp; &nbsp; );&nbsp; &nbsp; var studentNames = searchResponse.Aggregations.Terms("student_name");&nbsp; &nbsp; foreach(var bucket in studentNames.Buckets)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; var header = $"Student Name: {bucket.Key}";&nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine(header);&nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine(new string('-', header.Length));&nbsp; &nbsp; &nbsp; &nbsp; foreach(var hit in bucket.TopHits("top_grades").Documents<Student>())&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine($"Id: {hit.Id}, Grade: {hit.Grade}");&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine();&nbsp; &nbsp; }}它打印出来Student Name: Bar-----------------Id: 19, Grade: 19Id: 17, Grade: 17Id: 15, Grade: 15Id: 13, Grade: 13Id: 11, Grade: 11Id: 9, Grade: 9Id: 7, Grade: 7Id: 5, Grade: 5Id: 3, Grade: 3Id: 1, Grade: 1Student Name: Foo-----------------Id: 20, Grade: 20Id: 18, Grade: 18Id: 16, Grade: 16Id: 14, Grade: 14Id: 12, Grade: 12Id: 10, Grade: 10Id: 8, Grade: 8Id: 6, Grade: 6Id: 4, Grade: 4Id: 2, Grade: 2
打开App,查看更多内容
随时随地看视频慕课网APP