聚合,建议在ElasticSearch(Nest,ElasticSearch.net)中得到完整的对象
本文关键字:ElasticSearch 对象 net 聚合 Nest | 更新日期: 2023-09-27 18:22:17
我对弹性搜索还很陌生,我正在使用NEST查询到弹性。以下是我的代码片段。
var searchResults =
elasticClient.Client.Search<T>(
s => s
.Size(20)
.Fields(core)
.QueryString(String.Format("*{0}*", query)).MinScore(1).QueryString(String.Format("*{0}*", query.Replace(" ", "")))
.Highlight(h => h
.PreTags("<b>")
.PostTags("</b>")
.OnFields(f => f
.PreTags("<em>")
.PostTags("</em>")
)
)
);
var suggestResults = elasticClient.Client.Suggest<T>(s => s
.Term("suggest", m => m
.SuggestMode(SuggestMode.Always)
.Text(query)
.Size(10)
.OnField(core)
));
var aggregation = elasticClient.Client.Search<T>(s => s
.Aggregations(a => a
.Terms("term_items", gh=>gh
.Field(p=>p.Town)
.Aggregations(gha=>gha
.SignificantTerms("bucket_agg", m => m
.Field(p => p.Town)
.Size(2)
.Aggregations(ma => ma.Terms("Town", t => t.Field(p => p.Town)))
)
)
)
)
);
我确实得到了文档列表(我指定的域对象的列表),但在建议和聚合的情况下,它不会返回域对象?
我提前道歉,希望你能给我指明正确的方向。
我正在寻找一种在NEST中实现的方法。
要获得聚合,需要使用结果的Aggs
属性。根据文件:
聚合的结果是使用请求中指定的键从响应的Aggs属性访问的。。。
在您的示例中,这将是"term_items"
。您也在进行子聚合,因此需要为每个顶级聚合提取这些子聚合,再次使用为子聚合指定的密钥"bucket_agg"
。你的代码应该看起来像
var agg = results.Aggs.Terms("term_items");
if (agg!= null && agg.Items.Count > 0)
{
foreach (var termItemAgg in agg.Items)
{
// do something with the aggregations
// the term is accessed using the Key property
var term = termItemAgg.Key;
// the count is accessed through the DocCount property
var count = termItemAgg.Count;
// now access the result of the sub-aggregation
var bucketAgg = termItemAgg.Aggs.SignificantTerms("bucket_agg");
// do something with your sub-aggregation results
}
}
文档中有更多详细信息。
要获得建议,请使用调用ElasticClient.Suggest
方法时指定的键访问结果对象的Suggestions
属性。类似的东西
var suggestions = result.Suggestions["suggest"]
.FirstOrDefault()
.Options
.Select(suggest => suggest.Payload)
.ToList();
希望这能有所帮助。