聚合,建议在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中实现的方法。

聚合,建议在ElasticSearch(Nest,ElasticSearch.net)中得到完整的对象

要获得聚合,需要使用结果的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();

希望这能有所帮助。