c# - 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;
}
}
任何想法?谢谢
解决方案
问题是您的映射是文本类型。
要在文本字段上进行术语聚合,您需要为该字段打开 fielddata。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))
现在我应该补充一点,如果图像是字符串列表,则不需要进行嵌套映射。字符串列表基本上与弹性搜索中的单个字符串相同,因此您可能可以执行以下操作:
.Keyword(t => t.Name(n => nn.Images))
推荐阅读
- javascript - 表单方法 post 和 jquery/javascript 代码在所有浏览器中的 1 台计算机上运行
- json - 使用 Powershell 将数组添加到 JSON
- windows - Windows 上的 OpenSSL 在 genrsa 进程中间停止
- java - 使用 PDFBox 2.x 从 PDF 中提取文本时出现合并行的问题
- machine-learning - sklearn 逻辑回归中的 lbfgs 求解器:如何设置停止标准?
- azure - 使用 Cordova 对 Azure-AD 进行身份验证
- excel - 如何根据给定的单词在excel中拆分一串文本?
- python - 使用 conda 卸载特定版本 python 的包
- xamarin - 如何使用 xamarin 在 Google 地图上每 x 秒刷新/更新 pin 位置
- acumatica - 当供应商订单到达 ACUMATICA ERP 仓库时,自动履行延期交货