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