在弹性搜索中进行分组

时间:2017-04-20 06:06:40

标签: c# asp.net-mvc linq elasticsearch nest

我在弹性搜索中进行分组操作时遇到问题。

实际上,我的文档中有3个字段。如下:

Id Type  Year

现在我想对ExceptionType和Year进行分组,并在" ResultCount"中计算它。

我试过这个,但它不起作用:

.Aggregations(a => a
            .ValueCount("ResultCount", c => c
                .Field(p => p.Id)
                .Field(p=> p.Year)
            ))
             .Aggregations(a => a
                .Terms("Type", st => st
                    .Field(o => o.Type)
                    .Size(10))).Size(5)
             .Aggregations(aa => aa
                    .Max("Year", m =>  m
                        .Field(o => o.Year)
                    ))
           );

请尽快为此问题提供解决方案。谢谢。

1 个答案:

答案 0 :(得分:0)

我会尽力帮助你。在弹性唯一术语和子聚合中没有组这样的东西。如果你想按年计算错误类型,你可以这样做:

  var response = db.Search<Error>(s => 
                s.Size(0)
                .Aggregations(aggs1 => aggs1.Terms("level1",
                        l1 =>l1.Field(f => f.Type)
                               .Aggregations(aggs2 => aggs2.Terms("leve2", t=> t.Field(f=>f.Year))))));

           foreach (var l1 in response.Aggs.Terms("level1").Buckets)
           {
               foreach (var l2 in l1.Terms("leve2").Buckets)
               {
                   Console.WriteLine("Type:{0}, Year:{1}, Count:{2}", l1.Key, l2.Key, l2.DocCount);
               }
           }

但请记住,除了非分析字段或关键字字段之外,这只会像你一样工作,如果你想要使用date_histogram aggregation这样的日期条款。 如果索引映射看起来像这样

  {
         "properties": {
            "type": {
               "type": "keyword"
            },
            "year": {
               "type": "long"
            }
         }
  }

您将获得每年每种错误类型的项目数 您也可以在嵌套聚合中执行其他类型的聚合 注意:术语聚合是近似的,因此如果您没有获得准确的值,请不要感到惊讶。