NEST聚合类似于SQL Group By

时间:2016-10-14 13:42:43

标签: elasticsearch nest

插入ES时,这是我的课程

public class BasicDoc
{
    public string Name { get; set; }

    public string Url { get; set; }
}

我使用NEST成功将我的文档插入ES。但是我无法进行聚合。我的目标是拥有类似于SQL Group By的东西。到目前为止我做了什么:

var response = elastic.Search<BasicDoc>(s => s
                    .Aggregations(a => a
                        .Terms("group_by_url", st => st
                            .Field(o => o.Url)
                        ))
);

我尝试根据BasicDoc.Url聚合我的文档。说我在ES中有这些:

  1. / API / CALL1 / V1
  2. / API / CALL2 / V1
  3. / API / CALL1 / V1
  4. 当我调试时,我的Nest.BucketAggregate将有4个项目键, api call1 call2 v1 。我只期待2个是/ api / call1 / v1和/ api / call2 / v1。我做错了什么?

1 个答案:

答案 0 :(得分:0)

您目前在Url媒体资源上设置了analysis,这意味着它会被standard analyzer和倒置索引中存储的字词标记化。如果您需要能够在Uri上搜索并且也需要在其上进行聚合,那么您可以考虑将其映射为multi_field,其中一个字段映射分析它,另一个才不是。这是一个带映射

的索引创建示例
client.CreateIndex("index-name", c => c
    .Mappings(m => m
        .Map<BasicDoc>(mm => mm
            .AutoMap()
            .Properties(p => p
                .String(s => s
                    .Name(n => n.Url)
                    .Fields(f => f
                        .String(ss => ss
                            .Name("raw")
                            .NotAnalyzed()
                        )
                    )
                )
            )
        )
    )
);

执行聚合时,您现在可以使用Uri原始字段

var response = client.Search<BasicDoc>(s => s
    .Size(0)
    .Aggregations(a => a
        .Terms("group_by_url", st => st
            .Field(o => o.Url.Suffix("raw"))
        )
    )
);