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

标签 elasticsearch nest

通过 Nest,我正在进行术语聚合。

我还在做内部 TopHits 聚合。

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

我希望直接在结果中获得 tophits 值,而不使用 NEST TopHits() 方法读取 aggs。我希望将所有数据都包含在 info 中,就像我们在 Elasticsearch 经典请求中那样。

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

我的聚合请求:

 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 不包含 toppHits 结果:

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 巢 : get TopHits result directly without using bucket. TopHits(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41591470/

相关文章:

elasticsearch基于属性的嵌套聚合,并根据每个桶中的公式获取自定义值

rest - 如何使用 REST API 获取身份验证 token 或登录 Elastic Search?例如来自 postman

elasticsearch - 过滤数据时出现logstash grok问题

apache - 当我尝试运行 'Status'时,字段 'pio status'重复

elasticsearch - Elasticsearch 的最佳同义词方法是什么?

c# - Elasticsearch-嵌套-映射-多目标别名或仅指定每个文档要使用的1个多字段子字段

elasticsearch - Elastic _score 和 Hits 中的 NEST Score 属性之间有什么关系?

elasticsearch - 启动Elasticsearch.bat后出现NoShardAvailableException

elasticsearch - 如何显示NEST查询结果?

c# - 批量搜索文档 Elasticsearch