为了账号安全,请及时绑定邮箱和手机立即绑定

列表项上的 ElasticSearch 聚合

列表项上的 ElasticSearch 聚合

C#
红糖糍粑 2022-07-23 17:21:33
如何按列表项聚合(散列文本)这是我的代码public class Tweet{     public ulong id { get; set; }     public string text { get; set; }     [Nest.Nested]     public List<hashtags> hashtags { get; set; }}public class hashtags{      public string hashtext { get; set; } }我的索引数据示例如下: "hashtags" : [        {          "hashtext" : "aaaa"        },        {          "hashtext" : "bbbb"        },        {          "hashtext" : "ccccc"        }      ],    }.Aggregations(childAggs => childAggs                .Nested("project_tags", n => n                    .Path(p => p.hashtags)                    .Aggregations(nestedAggs => nestedAggs                        .Terms("by_tags", t => t                            .Field(f => f.hashtags.First().hashtext)                    )                )            ))如何仅对 hashtext 属性进行聚合查询,例如我想获取所有带有 count 的 hashtext 文本aaaa     3   times ccccc    5  times
查看完整描述

1 回答

?
米脂

TA贡献1836条经验 获得超3个赞

只要将hashtextonhashtags映射为keyword数据类型(或映射为启用了 fielddatatext的数据类型,并附带执行此操作的警告),您所拥有的将起作用。


这是一个工作示例


private static void Main()

{

    var defaultIndex = "my_index";

    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

        .Mappings(m => m

            .Map<Tweet>(mm => mm

                .AutoMap()

            )

        )

    );


    var bulkResponse = client.Bulk(b => b

        .IndexMany(new []

        {

            new Tweet 

            { 

                id = 1, 

                text = "foo",

                hashtags = new List<hashtags>

                { 

                    new hashtags { hashtext = "aaaa" },

                    new hashtags { hashtext = "bbbb" },

                    new hashtags { hashtext = "cccc" }

                }

            }, 

            new Tweet

            {

                id = 2,

                text = "bar",

                hashtags = new List<hashtags>

                {

                    new hashtags { hashtext = "aaaa" },

                    new hashtags { hashtext = "bbbb" }

                }

            },

            new Tweet

            {

                id = 3,

                text = "baz",

                hashtags = new List<hashtags>

                {

                    new hashtags { hashtext = "aaaa" },

                    new hashtags { hashtext = "cccc" }

                }

            }

        })

        .Refresh(Refresh.WaitFor)

    );


    var searchResponse = client.Search<Tweet>(s => s

        .Size(0)

        .Aggregations(childAggs => childAggs

                .Nested("hashtags", n => n

                    .Path(p => p.hashtags)

                    .Aggregations(nestedAggs => nestedAggs

                        .Terms("by_tags", t => t

                            .Field(f => f.hashtags.First().hashtext)

                        )

                    )

                )

            )

        );


    var hashtagBuckets = searchResponse.Aggregations.Nested("hashtags").Terms("by_tags").Buckets;


    foreach(var bucket in hashtagBuckets)

    {

        Console.WriteLine($"{bucket.Key}\t{bucket.DocCount} times");

    }

}


public class Tweet

{

    public ulong id { get; set; }

    public string text { get; set; }

    [Nested]

    public List<hashtags> hashtags { get; set; }

}



public class hashtags

{

    [Keyword]

    public string hashtext { get; set; }

}

它将以下内容写入控制台


aaaa  3 times

bbbb  2 times

cccc  2 times


查看完整回答
反对 回复 2022-07-23
  • 1 回答
  • 0 关注
  • 107 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信