c# - C#ElasticSearch NEST聚合:分组依据

标签 c# elasticsearch nest

我的ES NEST查询有问题。它“进行分组”,但项目列表为空。
我查找了示例并阅读了发现的内容,但结果仍然是空的。
这是我的查询:

public partial class ElasticSearchService
    {
        private const string groupBySubCategoryKey = "SubCategoryKey";

        public async Task SiteMap()
        {
            ISearchResponse<AdvertisementObjectEntityExtended> result = await Client.SearchAsync<AdvertisementObjectEntityExtended>(s => s
               .Index(ElasticClientFactorySettings.AdvertisementObjectIndex)
               .Aggregations(agr =>
                agr.Terms(groupBySubCategoryKey,
                    g => g.Field(f =>
                        f.SubCategoryKey))));

            var r = result.Aggregations.Terms(groupBySubCategoryKey);
       
}
}
public static class ElasticClientFactory
    {
        public static async Task<ElasticClient> ClientAsync(ElasticSearchSettings settings)
        {
            Uri uri = new Uri($"{settings.EndPoint}");

            ConnectionSettings ConnectionSettings = new ConnectionSettings(uri)
                                                    .DefaultIndex(ElasticClientFactorySettings.AdvertisementObjectIndex)
                                                    .DefaultMappingFor<AdvertisementObjectEntityExtended>(i => i.IndexName(ElasticClientFactorySettings.AdvertisementObjectIndex))
                                                    .EnableHttpCompression()
                                                    .PrettyJson();

            ElasticClient client =  new ElasticClient(ConnectionSettings);

            CreateIndexResponse createIndexResponse = await client.Indices.CreateAsync(ElasticClientFactorySettings.AdvertisementObjectIndex, c => c
                .Map<AdvertisementObjectEntityExtended>(m => m
                    .AutoMap()
                    .Properties(p => p
                         .Text(t => t.Name(n => n.Id).Analyzer(AnalyzerSettings.No))
                         .Text(t => t.Name(n => n.UserUniq).Analyzer(AnalyzerSettings.NotAnalyzed))
                         .Text(t => t.Name(n => n.Uniq).Analyzer(AnalyzerSettings.NotAnalyzed))
                         .Text(t => t.Name(n => n.MainCategoryKey).Analyzer(AnalyzerSettings.NotAnalyzed))
                         .Text(t => t.Name(n => n.SubCategoryKey).Analyzer(AnalyzerSettings.NotAnalyzed))
                         .Nested<List<string>>(n => n.Name(nn => nn.Images)
                        )
                    )
                )
            );

            return client;
        }
    }

public partial class ElasticSearchService : IElasticSearchService
    {
          public  ElasticSearchService(IOptions<ElasticSearchSettings> settings)
        {
            Client = ElasticClientFactory.ClientAsync(settings.Value).Result;
        }
    }
任何的想法?
n

最佳答案

问题是您的映射为文本类型。
要使术语汇总在文本字段上起作用,您需要打开该字段的字段数据。 https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html#CO255-1
但是,您可能真正想要的是使用“关键字”字段而不是“文本”字段,它会自动与术语聚合一起使用。默认情况下不分析它们。因此,对映射的以下更改应该可以解决问题:

    .Keyword(t => t.Name(n => n.Id))
    .Keyword(t => t.Name(n => n.UserUniq))
    .Keyword(t => t.Name(n => n.Uniq))
    .Keyword(t => t.Name(n => n.MainCategoryKey))
    .Keyword(t => t.Name(n => n.SubCategoryKey))
现在我应该补充一点,如果图像是字符串列表,则无需进行嵌套映射。字符串列表基本上与Elasticsearch中的单个字符串相同,因此您可以执行以下操作:
    .Keyword(t => t.Name(n => nn.Images))

关于c# - C#ElasticSearch NEST聚合:分组依据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64703610/

相关文章:

elasticsearch - 如何使用对象初始化语法将 bool 查询应该子句包装在 bool 查询过滤器子句中?

elasticsearch - Tomcat 日志的 Logstash GROK 过滤器

c# - 创建文件后拖放到桌面? (C#)

C#相当于覆盖类中的__dict__

c# - 如何取消 RIA 服务 LoadOperation

elasticsearch - Elasticsearch 平均时差聚合查询

windows - 在Windows上安装LogStash

c# - elasticsearch NEST客户端,属性 "not_analyzed"归档,当搜索关键字包含连字符时仍会被分析

elasticsearch - Elasticsearch Soundex匹配查询-NEST

C# 快速折线图