Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#ElasticSearch嵌套聚合:按分组_C#_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch_Nest - Fatal编程技术网 elasticsearch,nest,C#,elasticsearch,Nest" /> elasticsearch,nest,C#,elasticsearch,Nest" />

c#ElasticSearch嵌套聚合:按分组

c#ElasticSearch嵌套聚合:按分组,c#,elasticsearch,nest,C#,elasticsearch,Nest,我的ES NEST查询有问题。它“生成组”,但项目列表为空。 我找了一些例子,读了我的发现,但结果仍然是空的 这是我的疑问: public partial class ElasticSearchService { private const string groupBySubCategoryKey = "SubCategoryKey"; public async Task SiteMap() {

我的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);
       
公共部分类ElasticSearchService
{
private const string groupBySubCategoryKey=“SubCategoryKey”;
公共异步任务站点地图()
{
ISearchResponse结果=等待客户端.SearchAsync(s=>s
.Index(ElasticClientFactorySettings.AdvertisementObjectIndex)
.聚合(agr=>
农业术语(按子类分组),
g=>g.Field(f=>
f、 子类别键);
var r=结果.聚合.术语(groupBySubCategoryKey);
} }

公共静态类ElasticClientFactory
{
公共静态异步任务ClientAsync(ElasticSearchSettings)
{
Uri=新Uri($“{settings.EndPoint}”);
ConnectionSettings ConnectionSettings=新的ConnectionSettings(uri)
.DefaultIndex(ElasticClientFactorySettings.AdvertisementObjectIndex)
.DefaultMappingFor(i=>i.IndexName(ElasticClientFactorySettings.AdvertisementObjectIndex))
.EnableHttpCompression()
.PrettyJson();
ElasticClient=新的ElasticClient(连接设置);
CreateIndexResponse CreateIndexResponse=await client.Indexs.CreateAync(ElasticClientFactorySettings.AdvertisementObjectIndex,c=>c
.Map(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.subcategory.key).Analyzer(AnalyzerSettings.NotAnalyzed))
.Nested(n=>n.Name(nn=>nn.Images)
)
)
)
);
返回客户;
}
}
公共部分类ElasticSearchService:IElasticSearchService
{
公共ElasticSearchService(IOPS设置)
{
Client=ElasticClientFactory.clientsync(settings.Value).Result;
}
}
有什么想法吗?
thnx

问题在于您的映射是文本类型的

要使术语聚合在文本字段上工作,需要为该字段启用fielddata

但您可能真正想要的是使用关键字字段而不是文本,因为文本会自动处理术语聚合。默认情况下不会对其进行分析。因此,对映射的以下更改应该可以做到这一点:

    .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))

问题是您的映射类型为Text

要使术语聚合在文本字段上工作,需要为该字段启用fielddata

但您可能真正想要的是使用关键字字段而不是文本,因为文本会自动处理术语聚合。默认情况下不会对其进行分析。因此,对映射的以下更改应该可以做到这一点:

    .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))

结果我得到了2个bucket,在bucket中有一个value属性,它是长度为0的集合!术语聚合只返回每个唯一术语及其计数。您将需要类似于
result.Aggregations.Terms(groupBySubCategoryKey).bucket
的内容,其中每个bucket都有一个
Key
字段和一个
DocCount
字段。它们在那里,但是我可能会做错什么,因为我也需要集合中的分组项,但是我得到的DocCount不是0,而是没有元素,我需要元素,比如带有lambda表达式的GroupBy。elasticsearch并不是执行map/reduce/GroupBy操作的最佳工具。如果你无论如何都需要每个元素,你只需要发布一个搜索来获取所有元素,然后在elasticsearch之外进行分组。或者,您可以进行聚合,然后对每个组进行搜索。或者,如果您想在一个请求中完成所有操作,您可以在当前请求的基础上使用Top Hits聚合。结果我得到了2个bucket,在bucket中有一个value属性,它是长度为0的集合!术语聚合只返回每个唯一术语及其计数。您将需要类似于
result.Aggregations.Terms(groupBySubCategoryKey).bucket
的内容,其中每个bucket都有一个
Key
字段和一个
DocCount
字段。它们在那里,但是我可能会做错什么,因为我也需要集合中的分组项,但是我得到的DocCount不是0,而是没有元素,我需要元素,比如带有lambda表达式的GroupBy。elasticsearch并不是执行map/reduce/GroupBy操作的最佳工具。如果你无论如何都需要每个元素,你只需要发布一个搜索来获取所有元素,然后在elasticsearch之外进行分组。或者,您可以进行聚合,然后对每个组进行搜索。或者,如果您想在一个请求中完成所有操作,您可以在当前请求的基础上使用Top Hits聚合。