gpt4 book ai didi

elasticsearch NEST : get TopHits result directly without using bucket. TopHits()

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

使用嵌套我正在做一个术语聚合。

我也在做一个内部 TopHits 聚合。

我的结果为我提供了响应对象中的所有结果信息,除了 TopHits 值,我可以通过 TopHits() 方法读取这些值。

我希望不使用 NEST TopHits() 方法直接在结果中使用 tophits 值来读取 aggs。我想像 Elasticsearch 经典请求一样在 info 中包含所有数据。

这就是我实际在做的事情:

我的聚合请求:

 var response = Client.Search<myclass>(s => s
.Type("type")
.Aggregations(a => a
.Terms("code_bucket", t => t
.Field("field_of_aggregation")
.Size(30)
.Order(TermsOrder.CountAscending)
.Aggregations(a2 => a2
.TopHits("code_bucket_top_hits", th => th.Size(20))
)
)));

我收到一个结果对象,我可以访问除 TopHits 之外的所有信息。

如果我们检查结果,我们可以看到 TopHits 值存储在私有(private)字段“_hits”中:
enter image description here

如果我对结果对象进行字符串化,我可以看到 TopHits 的总数,但我看不到字段 _hits,所以我可以看到文档:
JavaScriptSerializer js = new JavaScriptSerializer();
string json = js.Serialize(response);

json 不包含 topHits 结果:

enter image description here

我可以访问值,但我需要使用嵌套方法 TopHits():
var firstBucket= response.Aggs.Terms("code_bucket");
foreach (var bucket in firstBucket.Buckets)
{
var hits = bucket.TopHits("code_bucket_top_hits");
foreach (var hit in hits.Documents<myclass>())
{
var prop1= hit.prop1;
var prop2= hit.prop2;
}
}
}

但是,如果我可以将所有信息合二为一,就像我们在没有嵌套的情况下进行 Elasticsearch 请求时那样,那将非常有用

不知道有没有办法?

最佳答案

NEST 是对 Elasticsearch 的更高级别的抽象,它使用强类型对每个请求和响应进行建模,提供流畅的对象初始化器语法来构建请求,以及访问部分响应的方法,而无需自己处理 JSON 序列化。

但是,有时您可能想自己管理这件事,这听起来像是您想做的事情。在这些情况下,可以使用 Elasticsearch.Net,它是 Elasticsearch 的低级客户端,对您如何建模请求和响应没有意见。

您可以在 Elasticsearch.Net 中使用客户端而不是 NEST,但是,好消息是 NEST 在幕后使用 Elasticsearch.Net,并且还通过 .LowLevel 公开了低级客户端位于 IElasticClient 的房产.为什么要在 NEST 上使用低级客户端,而不是直接使用 Elasticsearch.Net?这样做的一个主要原因是,您可以在需要时利用强类型的请求和响应,并利用 NEST 对 Json.NET 的使用进行序列化,但绕过这一点并在需要/需要时使用低级客户端进行调用到。

这是一个例子

var client = new ElasticClient();

var searchRequest = new SearchRequest<Question>
{
Size = 0,
Aggregations = new TermsAggregation("top_tags")
{
Field = "tags",
Size = 30,
Order = new[] { TermsOrder.CountAscending },
Aggregations = new TopHitsAggregation("top_tag_hits")
{
Size = 20
}
}
};

var searchResponse = client.LowLevel.Search<JObject>("posts", "question", searchRequest);

// this will be of type JObject. Do something with it
searchResponse.Body

在这里,我可以使用 NEST 的对象初始化语法来构造请求,但使用低级客户端将响应反序列化到 Json.NET JObject .您可以反序列化为 T通过在 client.LowLevel.Search<T>() 中更改您的选择.例如,您可以使用
var searchResponse = client.LowLevel.Search<string>("posts", "question", searchRequest);

返回一个字符串,或
var searchResponse = client.LowLevel.Search<Stream>("posts", "question", searchRequest);

返回流等

关于elasticsearch NEST : get TopHits result directly without using bucket. TopHits(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41591470/

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