亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

ElasticSearch NEST - GroupBy then OrderBy

ElasticSearch NEST - GroupBy then OrderBy

C#
烙印99 2022-08-20 16:51:36
我需要將 linq 查詢轉換為 NEST。這就是我的 linq 查詢的樣子:var result = studentList             .GroupBy(student => student.Name)             .Select(group => group.OrderByDescending(student => student.grade).Take(3))             .SelectMany(p => p);它應該:按學生姓名分組按年級對每個組進行個人排序,降序從每個小組中選出成績最好的前X名學生它正在與linq一起工作,但是如何使用NEST做到這一點?我嘗試聚合,子聚合,排序桶,但沒有成功。我知道如何按名稱分組,但接下來呢?client.Search<Students>(s => s .Aggregations(a => a     .Terms("group_by_name", ts => ts         .Field(o => o.Name))));如何對每個小組進行排序,如何從每個小組的頂尖學生中取出?
查看完整描述

1 回答

?
侃侃爾雅

TA貢獻1801條經驗 獲得超16個贊

假設模型像


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: 19

Id: 17, Grade: 17

Id: 15, Grade: 15

Id: 13, Grade: 13

Id: 11, Grade: 11

Id: 9, Grade: 9

Id: 7, Grade: 7

Id: 5, Grade: 5

Id: 3, Grade: 3

Id: 1, Grade: 1


Student Name: Foo

-----------------

Id: 20, Grade: 20

Id: 18, Grade: 18

Id: 16, Grade: 16

Id: 14, Grade: 14

Id: 12, Grade: 12

Id: 10, Grade: 10

Id: 8, Grade: 8

Id: 6, Grade: 6

Id: 4, Grade: 4

Id: 2, Grade: 2


查看完整回答
反對 回復 2022-08-20
  • 1 回答
  • 0 關注
  • 133 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號