如何使用值名称计算重复值

时间:2017-11-19 23:14:18

标签: c# .net elasticsearch nest

我对Elasticsearch很新,我正在使用NEST库。如何计算重复值?
这是我的班级:

public class Book
{
   public string BookName {get;set;}
   public string Author {get;set;}
}


这是我的数据:

BookName=X, Author=a<br>
BookName=Y, Author=a<br>
BookName=Z, Author=b<br>
BookName=C, Author=b<br>
BookName=T, Author=c<br>


查询结果应为:

a- 2
b- 2
c- 1

我尝试了以下查询,但它不起作用:

 client.Search<Book>(s => s
.Aggregations(a => a
.Terms("group_by_auth", ts => ts
        .Field(o => o.Author)
        .Size(10)
        .Aggregations(aa => aa
            .Sum("sum_value", sa => sa
                .Field(o => o.Author)
            )
        )
    )
));

映射是:

client= new ElasticClient(connectionSettings);
        client.CreateIndex("books", c => c
        .Mappings(m => m
            .Map<Book>(mm => mm
            .Properties(ps=>ps
            .Text(s=>s
            .Name(a=>a.Author)
            )))
        )

1 个答案:

答案 0 :(得分:0)

如果你想要计算这些术语,你就可以得到它

var uri = new Uri("http://localhost.fiddler:9200");

            ElasticClient db = new ElasticClient(uri);

            var data = new[] {
                                new{ BookName= "X", Author="a" },
                                new{ BookName= "Y", Author="a" },
                                new{ BookName= "Z", Author="b" },
                                new{ BookName= "C", Author="b" },
                                new{ BookName= "T", Author="c" },
                            };

            db.DeleteIndex("test");

            foreach (var d in data)
            {
                db.Index(d, id => id.Index("test"));
            }

            System.Threading.Thread.Sleep(1000);

            var items = db.Search<dynamic>(s => s.Size(0).Aggregations(aggr => aggr.Terms("group_by_auth", ts => ts.Field("author.keyword"))));

            foreach (var item in items.Aggs.Terms("group_by_auth").Buckets)
            {
                Console.WriteLine(item.Key + "-" + item.DocCount);
            }

            Console.WriteLine("DONE");

            Console.ReadLine();