gpt4 book ai didi

c# - 一次调用即可接收按文档类型分组的搜索结果(NEST,AWS Elasticsearch)

转载 作者:行者123 更新时间:2023-12-02 23:50:28 26 4
gpt4 key购买 nike

所有。在此先感谢您的帮助!

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

所以问题是:如何在一次 call 中获得某种响应图以及搜索结果?

我的意思是,例如,这是我的答复:
Doc 1-主题
Doc 2-主题
Doc 3-视频
Doc 4-问题
Doc 5-视频
总结果:5个项目。

除此之外,我想收到以下“ map ”:
主题-2个项目
影片-2个项目
问题-1个项目

是否可以在一个请求中执行?还是可以通过几个请求来做到这一点?也许NEST聚合是必需的解决方案,但似乎没有“计数”逻辑

这是对分页数据和某些模型的搜索请求:

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
};
}

最佳答案

所以,我发现了。也许有人会觉得有用。
我需要的是“聚合”。在.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;
}

关于c# - 一次调用即可接收按文档类型分组的搜索结果(NEST,AWS Elasticsearch),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58063943/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com