在一次调用中接收按文档类型分组的搜索结果(NEST、AWS Elasticsearch)

Receiving search results with grouping by doc type in one call (NEST, AWS Elasticsearch)

全部。预先感谢您的帮助!

我正在使用 NEST 从 AWS Elasticsearch 请求分页数据。 AWS Elasticsearch 索引中的每个文档都有一个内容类型(主题、问题和视频)。作为响应,我收到当前页面的文档列表及其总结果。一切都很好。

所以问题是:如何在一次调用中接收某种响应图以及搜索结果?

我的意思是,例如,这是我的回复:
文档 1 - 主题
文档 2 - 主题
文档 3 - 视频
文件 4 - 问题
文档 5 - 视频
总结果:5 项。

除此之外,我还想收到以下内容'map':
主题 - 2 项
视频 - 2 项
问题 - 1 项

是否可以在一个请求中完成?或者如何通过多个请求来完成?也许 NEST 聚合是需要的解决方案,但似乎没有 'count' 逻辑

这是分页数据和部分机型的搜索请求:

public class Document
{
    public int DocumentId  { get; set; }
    public ContentType ContentType { get; set; }
    public DateTime UpdatedOn { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
}

public virtual DocumentSearchResponse FullTextSearch(DocumentSearchParams searchParams)
{
    var resultsSearchRequest = _elasticClient.Search<Document>(s => s.Index("some_index")
                                            .Query(q => q.Term(t => t.Field(f => f.DocumentId).Value(searchParams.ContentId))
                                                     && q.Terms(t => t.Field(f => f.ContentType).Terms(searchParams.GetContentTypesIds()))
                                                     && q.MultiMatch(m => m.Fields(fs => fs.Field(f => f.Title).Field(f => f.Description))
                                                         .Query(searchParams.SearchValue)
                                                         .Type(TextQueryType.MostFields)))
                                            .Sort(ss => ss.Descending(f => f.UpdatedOn))
                                            .From((searchParams.PageNumber - 1) * searchParams.PageSize)
                                            .Size(searchParams.PageSize));

    // Is valid check
    return new DocumentSearchResponse
    {
        PageResults = _searchResponseHelper.ToPageResults(resultsSearchRequest.Documents),
        PageResultsMap = new Dictionary<ContentType, int>, // <- here
        TotalResultsCount = resultsSearchRequest.HitsMetadata.Total.Value
    };
}

所以,我找到了。也许,有人会发现它有帮助。 我需要的东西是 'Aggregations'。在 .Form 和 .Size 之前添加以下行将按指定字段对搜索结果进行分组:

.Aggregations(a => a.Terms("contentType", t => t.Field(f => f.ContentType)))
.Query(...)
.Form(...)
.Size(...)

要将结果处理到我需要的词典中,添加以下内容 ( searchAggregationssearchResponse.Aggregations):

public Dictionary<ContentType, long> ToPageResultsMap(AggregateDictionary searchAggregations)
{
    var pageResultsMap = new Dictionary<ContentType, long>();

    var buckets = searchAggregations.Terms(DataConsts.SearchContentTypeDocFieldName).Buckets;

    foreach (var item in buckets)
    {
        if(int.TryParse(item.Key, out int contentType))
        {
            pageResultsMap.Add((ContentType)contentType, item.DocCount.HasValue ? item.DocCount.Value : 0);
        }
    }

    return pageResultsMap;
}